|
|
- #coding=utf-8
- import threading
- import random
- import time
-
- class SemaphoreThread(threading.Thread):
- """classusing semaphore"""
-
- availableTables=['A','B','C','D','E']
-
- def __init__(self,threadName,semaphore):
- """initialize thread"""
-
- threading.Thread.__init__(self,name=threadName)
- self.sleepTime=random.randrange(1,6)
- #set the semaphore as a data attribute of the class
- self.threadSemaphore=semaphore
- def run(self):
- """Print message and release semaphore"""
-
- #acquire the semaphore
- self.threadSemaphore.acquire()
- #remove a table from the list
- table=SemaphoreThread.availableTables.pop()
- print "%s entered;seated at table %s." %(self.getName(),table),
- print SemaphoreThread.availableTables
- time.sleep(self.sleepTime)
- #free a table
- print " %s exiting;freeing table %s." %(self.getName(),table),
- SemaphoreThread.availableTables.append(table)
- print SemaphoreThread.availableTables
- #release the semaphore after execution finishes
- self.threadSemaphore.release()
-
- threads=[] #list of threads
- #semaphore allows five threads to enter critical section
- threadSemaphore=threading.Semaphore(len(SemaphoreThread.availableTables))
- #创建一个threading.Semaphore对象,他最多允许5个线程访问临界区。
- #Semaphore类的一个对象用计数器跟踪获取和释放信号机的线程数量。
- #create ten threads
- for i in range(1,11):
- threads.append(SemaphoreThread("thread"+str(i),threadSemaphore))
- #创建一个列表,该列表由SemaphoreThread对象构成,start方法开始列表中的每个线程
- #start each thread
- for thread in threads:
- thread.start()
|