關鍵資源是壹次只能由壹個線程訪問的資源。壹個典型的例子就是打印機,它壹次只能被壹個程序用來執行打印功能,因為多線程不能同時運行,訪問這部分資源的代碼通常被稱為臨界區。
鎖定機構
線程的鎖類,使用這個類的獲取函數來鎖定,使用realease函數來解鎖。
導入線程導入時間類編號:
def __init__(self):
self.num = 0
self.lock =線程。Lock() def add(self):
Self.lock.acquire()#鎖定並鎖定相應的資源。
self.num += 1
編號= self.num
Self.lock.release()#解鎖並離開資源。
退貨數量
n = Num()類jdThread(線程。線程):
def __init__(self,item):
threading.Thread.__init__(self)
self.item =項目定義運行(self):
時間.睡眠(2)
Value = n.add()#將1加到num上,輸出原始數據和+1之後的數據。
打印範圍(5)中的項目(自身項目,值):
t = jdThread(項目)
啟動()
T.join()#使線程逐個執行123456789111213141515151565438。
當線程調用鎖的acquire()方法獲取鎖時,鎖進入“鎖定”狀態。壹次只有壹個線程可以獲得鎖。如果此時另壹個線程試圖獲取這個鎖,就會變成“阻塞”狀態,這種狀態稱為“同步阻塞”(參見多線程的基本概念)。
直到擁有鎖的線程調用鎖的release()方法來釋放鎖,鎖才進入“解鎖”狀態。線程調度器選擇其中壹個處於同步阻塞狀態的線程獲取鎖,並使該線程進入運行狀態。
旗語
信號量還提供了獲取方法和釋放方法。每當調用acquire方法時,如果內部計數器大於0,它將被減去1。如果內部計數器等於0,線程將被阻塞,直到線程調用release方法將內部計數器更新到大於1的位置。
導入線程導入時間類編號:
def __init__(self):
self.num = 0
self . SEM = threading . semantic(value = 3)#最多允許三個線程同時訪問資源。
定義添加(自身):
Self.sem.acquire()#內部計數器減1。
self.num += 1
編號= self.num
Self.sem.release()#內部計數器加1
退貨數量
n = Num()類jdThread(線程。線程):
def __init__(self,item):
threading.Thread.__init__(self)
self.item =項目定義運行(self):
時間.睡眠(2)
value = n.add()
打印範圍(100)內的項目(自身項目,值):