os_kernel_lab/related_info/lab7/semaphore_condition/thr-ex7.py

47 lines
1.8 KiB
Python
Raw Normal View History

#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()