因為第乙個執行緒開啟並取得gil,得到的n是100,在做io時,gil被釋放並給了下乙個執行緒得到的n還是為100,第二個執行緒做io時gil被釋放並給了第三個執行緒得到的n還是為100。因為剛傳送開執行緒的指令,並且還要做io,主線程此時得到的n還是100,故列印的結果為100。from threading import thread,lock,current_thread
import time
n = 100
mutex = lock()
def task():
global n
# mutex.acquire()
time.sleep(1)
print(current_thread().getname(), n)
temp = n
n = temp - 1
# mutex.release()
if __name__ == "__main__":
for i in range(3):
t = thread(target=task)
t.start()
結果:thread-3 100
thread-2 100
thread-1 100
process finished with exit code 0
如果在task加一把互斥鎖,則會輸出正確結果。
每個執行緒得到n都是之前繼承於上乙個執行緒計算的結果。from threading import thread,lock,current_thread
import time
n = 100
mutex = lock()
def task():
global n
mutex.acquire()
time.sleep(1)
print(current_thread().getname(), n)
temp = n
n = temp - 1
mutex.release()
if __name__ == "__main__":
for i in range(3):
t = thread(target=task)
t.start()
結果:thread-1 100
thread-2 99
thread-3 98
process finished with exit code 0
多執行緒競爭 鎖 互斥鎖 死鎖 GIL
同乙個程序裡執行緒是資料共享的,當各個執行緒訪問資料資源時會出現競爭狀態,資料幾乎同步會被多個執行緒占用,造成資料混亂。python提供的對執行緒控制的物件。鎖的好處 確保了某段關鍵 只能由乙個執行緒從頭到尾完整地執行 鎖的壞處 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執...
互斥鎖 死鎖 遞迴鎖 訊號量 GIL鎖
互斥鎖lock也是一種阻塞,可以保證共享資料操作的完整性。保證在任一時刻,只能有乙個執行緒訪問該物件 from multiprocessing import process from threading import thread from multiprocessing import lock 程...
自旋鎖和互斥鎖
1.理論分析 從理論上說,如果乙個執行緒嘗試加鎖乙個互斥鎖的時候沒有成功,因為互斥鎖已經被鎖住了,這個未獲取鎖的執行緒會休眠以使得其它執行緒可以馬上執行。這個執行緒會一直休眠,直到持有鎖的執行緒釋放了互斥鎖,休眠的執行緒才會被喚醒。如果乙個執行緒嘗試獲得乙個自旋鎖的時候沒有成功,該執行緒會一直嘗試加...