[2.7] bpo-30727: Fix a race condition in test_threading. (GH-2334). (#2353)
(cherry picked from commit 32cb968a2e
)
This commit is contained in:
parent
508267437c
commit
7709b4d57b
|
@ -359,21 +359,28 @@ class ConditionTests(BaseTestCase):
|
|||
# construct. In particular, it is possible that this can no longer
|
||||
# be conveniently guaranteed should their implementation ever change.
|
||||
N = 5
|
||||
ready = []
|
||||
results1 = []
|
||||
results2 = []
|
||||
phase_num = 0
|
||||
def f():
|
||||
cond.acquire()
|
||||
ready.append(phase_num)
|
||||
cond.wait()
|
||||
cond.release()
|
||||
results1.append(phase_num)
|
||||
cond.acquire()
|
||||
ready.append(phase_num)
|
||||
cond.wait()
|
||||
cond.release()
|
||||
results2.append(phase_num)
|
||||
b = Bunch(f, N)
|
||||
b.wait_for_started()
|
||||
# first wait, to ensure all workers settle into cond.wait() before
|
||||
# we continue. See issues #8799 and #30727.
|
||||
while len(ready) < 5:
|
||||
_wait()
|
||||
ready = []
|
||||
self.assertEqual(results1, [])
|
||||
# Notify 3 threads at first
|
||||
cond.acquire()
|
||||
|
@ -385,8 +392,8 @@ class ConditionTests(BaseTestCase):
|
|||
_wait()
|
||||
self.assertEqual(results1, [1] * 3)
|
||||
self.assertEqual(results2, [])
|
||||
# first wait, to ensure all workers settle into cond.wait() before
|
||||
# we continue. See issue #8799
|
||||
# make sure all awaken workers settle into cond.wait()
|
||||
while len(ready) < 3:
|
||||
_wait()
|
||||
# Notify 5 threads: they might be in their first or second wait
|
||||
cond.acquire()
|
||||
|
@ -398,7 +405,9 @@ class ConditionTests(BaseTestCase):
|
|||
_wait()
|
||||
self.assertEqual(results1, [1] * 3 + [2] * 2)
|
||||
self.assertEqual(results2, [2] * 3)
|
||||
_wait() # make sure all workers settle into cond.wait()
|
||||
# make sure all workers settle into cond.wait()
|
||||
while len(ready) < 5:
|
||||
_wait()
|
||||
# Notify all threads: they are all in their second wait
|
||||
cond.acquire()
|
||||
cond.notify_all()
|
||||
|
|
Loading…
Reference in New Issue