以下例項中:
import threading
lock = threading.lock(
)num =
0def
work1
(asd)
:global num
for i in
range
(asd)
: num +=
1print
('在當前的執行緒修改過後的num是'
,num)
defwork2
(asd)
:global num
for i in
range
(asd)
: num +=
1print
('在當前的執行緒修改過後的num是'
,num)
if __name__ ==
'__main__'
: t1 = threading.thread(target=work1,args=
(1000000,)
) t2 = threading.thread(target=work2, args=
(1000000,)
) t1.start(
) t2.start()-
----
----
----
----
----
----
----
----
----
----
----
----
----
--結果
在當前的執行緒修改過後的num是 1320928
在當前的執行緒修改過後的num是 1307852
我們發現,當給到work1與work2中的數字過大時,多執行緒執行完之後與我們所想要得到的結果並不一樣。
這是因為執行緒1(work1)正在執行,但並未執行完就被執行緒2(work2)搶斷執行,導致num在賦值的過程中並沒有給到其他執行緒這個值,所以累加時數字重複導致得到的結果小於正確值。
為此,我們在過程中新增程序鎖保證該程序執行完畢之後再交給其他執行緒執行
import threading
lock = threading.lock(
)num =
0def
work1
(asd)
:global num
for i in
range
(asd)
: flag = lock.acquire(
true
)if flag:
num +=
1 lock.release(
)print
('在當前的執行緒修改過後的num是'
,num)
defwork2
(asd)
:global num
for i in
range
(asd)
: flag = lock.acquire(
true
)if flag:
num +=
1 lock.release(
)print
('在當前的執行緒修改過後的num是'
,num)
if __name__ ==
'__main__'
: t1 = threading.thread(target=work1,args=
(1000000,)
) t2 = threading.thread(target=work2, args=
(1000000,)
) t1.start(
) t2.start()-
----
----
----
----
----
----
----
----
----
----
----
----
----
-結果 在當前的執行緒修改過後的num是 1926363
在當前的執行緒修改過後的num是 2000000
但互斥鎖只能確保其中乙個執行結果正確
互斥鎖優點:解決了資源爭搶的問題
缺點:變為了單執行緒,可能會變成死鎖
程序鎖(互斥鎖)(Python)
3 搶票示例 import json import time from multiprocessing import process,lock defsearch i with open ticket encoding utf 8 as f ticket json.load f print s 當前...
多程序讀寫鎖
多程序程式設計的核心技術是程序間的同步 通訊與互斥訪問 一 程序間的通訊 1 管道 2 system v訊號量 3 共享記憶體 4 訊息佇列 5 訊號 6 套接字 二 程序間對資源的互斥訪問 條件變數 訊號量讀寫鎖 記錄鎖 自旋鎖原子鎖 順序鎖 記錄鎖 int fcntl int fd,int cm...
互斥鎖 程序池
互斥鎖 當多個執行緒幾乎同時修改某乙個共享的資料時,需要進行同步操作,引入互斥鎖 當乙個執行緒更改資料的時候,先將它鎖定,其他執行緒不能修改,直到執行緒操作全部完成,此時會釋放資源 互斥鎖保證了同一時刻,只有乙個執行緒能對資源進行操作,保證資料的正確性 from threading import t...