Semaphore to control access to a critical section.
|
import threading import random import time
class SemaphoreThread( threading.Thread ): availableTables = [ "A", "B", "C", "D", "E" ]
def __init__( self, threadName, semaphore ): threading.Thread.__init__( self, name = threadName ) self.sleepTime = random.randrange( 1, 6 ) self.threadSemaphore = semaphore
def run( self ): self.threadSemaphore.acquire()
table = SemaphoreThread.availableTables.pop() print "%s entered; seated at table %s." % ( self.getName(), table ), print SemaphoreThread.availableTables
time.sleep( self.sleepTime ) # enjoy a meal
print " %s exiting; freeing table %s." % ( self.getName(), table ), SemaphoreThread.availableTables.append( table ) print SemaphoreThread.availableTables
self.threadSemaphore.release()
threads = []
threadSemaphore = threading.Semaphore(len( SemaphoreThread.availableTables ) )
for i in range( 1, 11 ): threads.append( SemaphoreThread( "thread" + str( i ),threadSemaphore ) )
for thread in threads: thread.start()
|
|
|
|
|