線程鎖(互斥鎖Mutex)
壹個進程下可以啟動多個線程,多個線程***享父進程的內存空間,也就意味著每個線程可以訪問同壹份數據,此時,如果2個線程同時要修改同壹份數據,會出現什麽狀況?
鎖的使用:
創建鎖
mutex = threading.Lock()
鎖定
mutex.acquire([timeout])
釋放
mutex.release()
import time
import threading
def addNum():
global num #在每個線程中都獲取這個全局變量
print('--get num:',num )
time.sleep(1)
num -=1 #對此公***變量進行-1操作
num = 100 #設定壹個***享變量
thread_list = []
for i in range(100):
t = threading.Thread(target=addNum)
t.start()
thread_list.append(t)
for t in thread_list: #等待所有線程執行完畢
t.join()
print('final num:', num )正常來講,這個num結果應該是0, 但在python 2.7上多運行幾次,會發現,最後打印出來的num結果不總是0,為什麽每次運行的結果不壹樣呢? 哈,很簡單,假設妳有A,B兩個線程,此時都 要對num 進行減1操作, 由於2個線程是並發同時運行的,所以2個線程很有可能同時拿走了num=100這個初始變量交給cpu去運算,當A線程去處完的結果是99,但此時B線程運算完的結果也是99,兩個線程同時CPU運算的結果再賦值給num變量後,結果就都是99。那怎麽辦呢? 很簡單,每個線程在要修改公***數據時,為了避免自己在還沒改完的時候別人也來修改此數據,可以給這個數據加壹把鎖, 這樣其它線程想修改此數據時就必須等待妳修改完畢並把鎖釋放掉後才能再訪問此數據。
註:不要在3.x上運行,不知為什麽,3.x上的結果總是正確的,可能是自動加了鎖