當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制
執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。
互斥鎖為資源引入乙個狀態:鎖定/非鎖定。
某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為「鎖定」,其他執行緒不能更改;直到該執行緒釋放資源,將資源的狀態變成「非鎖定」,其他的執行緒才能再次鎖定該資源。互斥鎖保證了每次只有乙個執行緒進行寫入操作,從而保證了多執行緒情況下資料的正確性。
acquire(
)——鎖定資源
release(
) — 釋放資源
源**:
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
在許多應用中程序需要以獨佔的方式訪問資源,當作業系統允許多個程序併發執行時可能會出現程序永遠被阻塞現象,如兩個程序分別等待對方所佔的資源,於是兩者都不能執行而處於永遠等待狀態,此現象稱為死鎖。
死鎖通常被定義為:如果乙個程序集合中的每個程序都在等待只能由此集合中的其他程序才能引發的事件,而無限期陷入僵持的局面稱為死鎖。
(1).互斥條件
臨界資源是獨佔資源,程序應互斥且排他的使用這些資源。
(2).占有和等待條件
程序在請求資源得不到滿足而等待時,不釋放已占有資源。
(3).不剝奪條件
又稱不可搶占,已獲資源只能由程序自願釋放,不允許被其他程序剝奪。
(4).迴圈等待
條件又稱環路條件,存在迴圈等待鏈,其中,每個程序都在等待鏈中等待下乙個程序所持有的資源,造成這組程序處於永遠等待狀態。
源**:
from threading import lock
from threading import thread
import time
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
多工實現方式 一
執行起來的應用程式就稱之為程序。也就是說當程式不執行的時候我們稱之為程式,當 程式執行起來他就是乙個程序。通俗的理解就是不執行的時候是程式,執行起來就是程序。程式和程序的對應關係是 程式只有乙個,但是程序可以有多個。程序是系統進行資源分配和排程的基本單位。在程式執行的過程中,由於被作業系統的排程演算...
python多工實現方法之協程
多工的實現方式,使用下面方法中的乙個或者若干個進行組合 1 多程序 2 多執行緒 3 協程 三種方式的實現和資源占用各有不同,其中資源占用和實現所需的系統開銷 記憶體 cpu等 逐漸減少,實現難度依次降低。可以簡單的認為 乙個程序可以包含多個執行緒,乙個執行緒包含多個協程。多工實現方式的選擇 cpu...
實現多工
多工介紹 簡單來說就是作業系統可以同時執行過個任務 單核cpu作業系統會讓各個任務交替執行 真正的多工只能在多核cpu上實現,也就是並行和併發2 併發 併發 指的是任務數多於cpu核數,通過作業系統的各種任務排程演算法,實現用多個任務 一起 執行 實際上總有一些任務不在執行,因為切換任務的速度相當快...