GIL鎖和自定義互斥鎖

2021-08-27 20:58:43 字數 1253 閱讀 1685

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

因為第乙個執行緒開啟並取得gil,得到的n是100,在做io時,gil被釋放並給了下乙個執行緒得到的n還是為100,第二個執行緒做io時gil被釋放並給了第三個執行緒得到的n還是為100。因為剛傳送開執行緒的指令,並且還要做io,主線程此時得到的n還是100,故列印的結果為100。

如果在task加一把互斥鎖,則會輸出正確結果。

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

每個執行緒得到n都是之前繼承於上乙個執行緒計算的結果。

多執行緒競爭 鎖 互斥鎖 死鎖 GIL

同乙個程序裡執行緒是資料共享的,當各個執行緒訪問資料資源時會出現競爭狀態,資料幾乎同步會被多個執行緒占用,造成資料混亂。python提供的對執行緒控制的物件。鎖的好處 確保了某段關鍵 只能由乙個執行緒從頭到尾完整地執行 鎖的壞處 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執...

互斥鎖 死鎖 遞迴鎖 訊號量 GIL鎖

互斥鎖lock也是一種阻塞,可以保證共享資料操作的完整性。保證在任一時刻,只能有乙個執行緒訪問該物件 from multiprocessing import process from threading import thread from multiprocessing import lock 程...

自旋鎖和互斥鎖

1.理論分析 從理論上說,如果乙個執行緒嘗試加鎖乙個互斥鎖的時候沒有成功,因為互斥鎖已經被鎖住了,這個未獲取鎖的執行緒會休眠以使得其它執行緒可以馬上執行。這個執行緒會一直休眠,直到持有鎖的執行緒釋放了互斥鎖,休眠的執行緒才會被喚醒。如果乙個執行緒嘗試獲得乙個自旋鎖的時候沒有成功,該執行緒會一直嘗試加...