]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
added barrier test (by Tim Peters)
authorGuido van Rossum <guido@python.org>
Mon, 23 May 1994 12:17:36 +0000 (12:17 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 23 May 1994 12:17:36 +0000 (12:17 +0000)
Lib/test/test_thread.py

index 5bc30766c3ab4f2bafb05ada17ce0b7f6c97310c..4e0eb70395aac04b0633423e65402febc827477c 100644 (file)
@@ -7,13 +7,18 @@ import thread
 import time
 
 mutex = thread.allocate_lock()
+whmutex = thread.allocate_lock() # for calls to whrandom
 running = 0
 done = thread.allocate_lock()
 done.acquire()
 
+numtasks = 10
+
 def task(ident):
        global running
-       delay = whrandom.random() * 10
+       whmutex.acquire()
+       delay = whrandom.random() * numtasks
+       whmutex.release()
        print 'task', ident, 'will run for', delay, 'sec'
        time.sleep(delay)
        print 'task', ident, 'done'
@@ -33,9 +38,69 @@ def newtask():
        running = running + 1
        mutex.release()
 
-for i in range(10):
+for i in range(numtasks):
        newtask()
 
 print 'waiting for all tasks to complete'
 done.acquire()
 print 'all tasks done'
+
+class barrier:
+       def __init__(self, n):
+               self.n = n
+               self.waiting = 0
+               self.checkin  = thread.allocate_lock()
+               self.checkout = thread.allocate_lock()
+               self.checkout.acquire()
+
+       def enter(self):
+               checkin, checkout = self.checkin, self.checkout
+
+               checkin.acquire()
+               self.waiting = self.waiting + 1
+               if self.waiting == self.n:
+                       self.waiting = self.n - 1
+                       checkout.release()
+                       return
+               checkin.release()
+
+               checkout.acquire()
+               self.waiting = self.waiting - 1
+               if self.waiting == 0:
+                       checkin.release()
+                       return
+               checkout.release()
+
+numtrips = 3
+def task2(ident):
+       global running
+       for i in range(numtrips):
+               if ident == 0:
+                       # give it a good chance to enter the next
+                       # barrier before the others are all out
+                       # of the current one
+                       delay = 0.001
+               else:
+                       whmutex.acquire()
+                       delay = whrandom.random() * numtasks
+                       whmutex.release()
+               print 'task', ident, 'will run for', delay, 'sec'
+               time.sleep(delay)
+               print 'task', ident, 'entering barrier', i
+               bar.enter()
+               print 'task', ident, 'leaving barrier', i
+       mutex.acquire()
+       running = running - 1
+       if running == 0:
+               done.release()
+       mutex.release()
+
+print '\n*** Barrier Test ***'
+if done.acquire(0):
+       raise ValueError, "'done' should have remained acquired"
+bar = barrier(numtasks)
+running = numtasks
+for i in range(numtasks):
+       thread.start_new_thread(task2, (i,))
+done.acquire()
+print 'all tasks done'