File tree Expand file tree Collapse file tree 1 file changed +41
-11
lines changed
Lib/test/test_free_threading Expand file tree Collapse file tree 1 file changed +41
-11
lines changed Original file line number Diff line number Diff 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 ()
179209class SmallSetTest (RaceTestBase , unittest .TestCase ):
You can’t perform that action at this time.
0 commit comments