併發程式設計(三) 執行緒互斥
阿新 • • 發佈:2021-06-17
執行緒互斥
該例項建立了3個執行緒t1、t2和t3同步執行,三個執行緒都訪問全域性變數data,並改變它的值。當第一個執行緒t1請求鎖成功後,開始訪問共享資料data,第二個執行緒t2和t3也開始請求鎖,但是此時t1還沒有釋放鎖,所以t2、t3處於等待狀態,直到t1呼叫lock.release()釋放鎖,t3才能得到鎖。這樣就保證了這三個執行緒共享資料data的一致性和同步性。並且這三個執行緒是併發執行的,沒有人為控制其獲得鎖的順序,所以他們執行的順序也是不定的。
注意:
呼叫acquire([timeout])時,執行緒將一直阻塞,直到獲得鎖或者直到timeout秒後返回是否獲得鎖。
import time import threading data=0 lock=threading.Lock() #建立一個鎖物件 def func(): global data print("%s acquire lock...\n" %threading.currentThread().getName()) if lock.acquire(): print("%s get lock...\n" %threading.currentThread().getName()) data += 1 #must lock time.sleep(2) #其他操作 print("%s release lock...\n" %threading.currentThread().getName()) #呼叫release()將釋放鎖 lock.release() startTime=time.time() t1=threading.Thread(target=func) t2=threading.Thread(target=func) t3=threading.Thread(target=func) t1.start() t2.start() t3.start() t1.join() t2.join() t3.join() endTime=time.time() print("used time is",endTime-startTime)