Skip to content

Commit 79dfe0a

Browse files
committed
Add concurrent test for set.pop() method
1 parent a5a4659 commit 79dfe0a

1 file changed

Lines changed: 30 additions & 0 deletions

File tree

‎Lib/test/test_free_threading/test_set.py‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,36 @@ def read_set():
148148
for t in threads:
149149
t.join()
150150

151+
def test_pop_concurrent(self):
152+
"""Test set.pop() from several threads."""
153+
NUM_THREADS = 4
154+
NUM_ITERS = 20
155+
156+
for _ in range(NUM_ITERS):
157+
items = set(range(self.SET_SIZE))
158+
s = set(items)
159+
barrier = Barrier(NUM_THREADS, timeout=2)
160+
popped = [[] for _ in range(NUM_THREADS)]
161+
162+
def pop_set(out):
163+
barrier.wait()
164+
while True:
165+
try:
166+
out.append(s.pop())
167+
except KeyError:
168+
break
169+
170+
threads = [Thread(target=pop_set, args=(out,)) for out in popped]
171+
for t in threads:
172+
t.start()
173+
for t in threads:
174+
t.join()
175+
176+
all_popped = [item for out in popped for item in out]
177+
self.assertEqual(len(all_popped), len(items))
178+
self.assertEqual(set(all_popped), items)
179+
self.assertEqual(len(s), 0)
180+
151181

152182
@threading_helper.requires_working_threading()
153183
class SmallSetTest(RaceTestBase, unittest.TestCase):

0 commit comments

Comments
 (0)