Skip to content

Commit cdcf88a

Browse files
committed
Resovle comments
1 parent 229ced3 commit cdcf88a

File tree

1 file changed

+41
-11
lines changed

1 file changed

+41
-11
lines changed

Lib/test/test_free_threading/test_set.py

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -148,32 +148,62 @@ def read_set():
148148
for t in threads:
149149
t.join()
150150

151-
def test_iter_length_hint_mutate(self):
151+
def test_length_hint_used_race(self):
152152
s = set(range(2000))
153153
it = iter(s)
154-
stop = Event()
154+
155+
NUM_LOOPS = 50_000
156+
barrier = Barrier(2)
155157

156158
def reader():
157-
while not stop.is_set():
159+
barrier.wait()
160+
for _ in range(NUM_LOOPS):
158161
it.__length_hint__()
159162

160163
def writer():
164+
barrier.wait()
161165
i = 0
162-
while not stop.is_set():
166+
for _ in range(NUM_LOOPS):
163167
s.add(i)
164168
s.discard(i - 1)
165169
i += 1
166170

167-
threads = [Thread(target=reader) for _ in range(4)]
168-
threads.append(Thread(target=writer))
171+
t1 = Thread(target=reader)
172+
t2 = Thread(target=writer)
173+
t1.start(); t2.start()
174+
t1.join(); t2.join()
169175

170-
for t in threads:
171-
t.start()
176+
def test_length_hint_exhaust_race(self):
177+
NUM_LOOPS = 10_000
178+
INNER_HINTS = 20
179+
barrier = Barrier(2)
180+
box = {"it": None}
172181

173-
stop.set()
182+
def exhauster():
183+
for _ in range(NUM_LOOPS):
184+
s = set(range(256))
185+
box["it"] = iter(s)
186+
barrier.wait() # start together
187+
try:
188+
while True:
189+
next(box["it"])
190+
except StopIteration:
191+
pass
192+
barrier.wait() # end iteration
193+
194+
def reader():
195+
for _ in range(NUM_LOOPS):
196+
barrier.wait()
197+
it = box["it"]
198+
for _ in range(INNER_HINTS):
199+
it.__length_hint__()
200+
barrier.wait()
201+
202+
t1 = Thread(target=reader)
203+
t2 = Thread(target=exhauster)
204+
t1.start(); t2.start()
205+
t1.join(); t2.join()
174206

175-
for t in threads:
176-
t.join()
177207

178208
@threading_helper.requires_working_threading()
179209
class SmallSetTest(RaceTestBase, unittest.TestCase):

0 commit comments

Comments
 (0)