1. 程式人生 > 其它 >併發程式設計(三) 執行緒互斥

併發程式設計(三) 執行緒互斥

執行緒互斥

該例項建立了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)