[2.7] bpo-30727: Fix a race condition in test_threading. (GH-2334). (#2353)

(cherry picked from commit 32cb968a2edd482891c33b6f2ebae10f1d305424)
diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py
index 46ff753..836f3e9 100644
--- a/Lib/test/lock_tests.py
+++ b/Lib/test/lock_tests.py
@@ -359,21 +359,28 @@
         # 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()
-        _wait()
+        # 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,9 +392,9 @@
             _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
-        _wait()
+        # 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()
         cond.notify(5)
@@ -398,7 +405,9 @@
             _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()