一.概念原理
當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制
執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。
互斥鎖為資源引入乙個狀態:鎖定/非鎖定。
某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為「鎖定」,其他執行緒不能更改;直到該執行緒釋放資源,將資源的狀態變成「非鎖定」,其他的執行緒才能再次鎖定該資源。互斥鎖保證了每次只有乙個執行緒進行寫入操作,從而保證了多執行緒情況下資料的正確性。
二.示例
from threading import thread
from threading import lock
g_num =
0#建立乙個全域性鎖物件
lock= lock(
)def
work1
(num)
:global g_num
lock.acquire(
)#加鎖
for i in
range
(num)
: g_num+=
1 lock.release(
)#解鎖
print
("in work1-->"
,g_num)
defwork2
(num)
:global g_num
lock.acquire(
)#加鎖
for i in
range
(num)
: g_num+=
1 lock.release(
)#解鎖
print
("work2-->"
,g_num)
defmain()
: t1 = thread(target=work1,args=
(1000000,)
) t2 = thread(target=work2, args=
(1000000,)
) t1.start(
) t2.start(
) t2.join(
)if __name__ ==
'__main__'
: main(
)print
("main-->"
,g_num)
結果:
in work1-
->
1000000
work2-
->
2000000
main-
->
2000000
其中,
鎖定方法acquire可以有乙個引數。
如果引數設定為true,則當前執行緒會堵塞,直到獲取到這個鎖為止(如果沒有指定,那麼預設為true)
如果設定引數為false,則當前執行緒不會堵塞
鎖的好處:
確保了某段關鍵**只能由乙個執行緒從頭到尾完整地執行
鎖的壞處:
阻止了多執行緒併發執行,包含鎖的某段**實際上只能以單執行緒模式執行,效率就大大地下降了
由於可以存在多個鎖,不同的執行緒持有不同的鎖,並試圖獲取對方持有的鎖時,可能會造成死鎖
一.概念
在多道程式系統中,由於多個程序的併發執行,改善了系統資源的利用率並提高了系統的處理能力。
然而,多個程序的併發執行也帶來了新的問題——死鎖。所謂死鎖是指多個程序因競爭資源而造成的一種僵局,若無外力作用,這些程序都將無法向前推進。
二.示例
lock1 = lock(
)lock2 = lock(
)def
work1
(num)
: lock1.acquire(
)#lock1上鎖
time.sleep(1)
print
("in work1"
) lock2.acquire(
)# lock2上鎖
print
("work1-----"
) lock2.release(
)#lock2解鎖
lock1.release(
)#lock1解鎖
defwork2
(num)
: lock2.acquire(
)#lock2加鎖
print
("in work2"
) lock1.acquire(
)#lock1加鎖
print
("work1-----"
) lock1.release(
)#lock1解鎖
lock2.release(
)#lock2解鎖
if __name__ ==
'__main__'
: t1 = thread(target=work1,args=
(1000000,)
) t2 = thread(target=work2, args=
(1000000,)
) t1.start(
) t2.start(
)
結果:
in work2
in work1
看了上面的例子我們來說說防止死鎖的加鎖機制
問題:你正在寫乙個多執行緒程式,其中執行緒需要一次獲取多個鎖,此時如何避免死鎖問題。
解決方案:
在多執行緒程式中,死鎖問題很大一部分是由於執行緒同時獲取多個鎖造成的。舉個例子:乙個執行緒獲取了第乙個鎖,然後在獲取第二個鎖的 時候發生阻塞,那麼這個執行緒就可能阻塞其他執行緒的執行,從而導致整個程式假死。 解決死鎖問題的一種方案是為程式中的每乙個鎖分配乙個唯一的id,然後只允許按照公升序規則來使用多個鎖。
python 互斥鎖,死鎖
同步與非同步之間的區別 1.同步 可以理解為執行緒a和b一塊配合工作,a執行到一定程度時要依靠b的某個結 果,於是停下來示意b執行,b執行完將結果給a,然後a繼續執行。2.非同步 非同步是指程序不需要一直等待下去,而是繼續執行下面的操作,不管其他程序的狀態,當有資訊返回的時候會通知程序進行處理,這樣...
Python互斥鎖 死鎖
死鎖當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制。執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,將資源的狀...
python 互斥鎖 死鎖
在多執行緒下,全域性變數是共享的,但是在兩個執行緒同時使用乙個全域性變數時,會出現這麼乙個情況,當a讀取了全域性變數a,b也讀取全域性變數a,a對a進行了 1操作,但是b是讀取a沒有進行一次 1操作之前的資料,然後b也進行 1操作,這就導致這錯誤的出現。為了防止這個錯誤的出現,所以引進互斥鎖。使用鎖...