Python多執行緒(3)lock

2021-10-01 12:30:57 字數 2108 閱讀 1573

先寫乙個多執行緒的程式

import threading

import time

defjob1()

:global a

for i in

range(10

):a +=

1print

('job1'

,a)def

job2()

:global a

for i in

range(10

):a +=

10print

('job2'

,a)if __name__ ==

'__main__'

: a =

0 t1 = threading.thread(target=job1)

t2 = threading.thread(target=job2)

t1.start(

) t2.start(

) t1.join(

) t2.join(

)

執行結果:

job1 1

job1 2

job1 3

job1 4

job1 5

job1 6

job1 7

job2 17

job2 27job1

job2 38

job2 48

job2 58

job2 68

job2 78

job2 88

job2 98

28job1 99

job1 100

發現會出現問題。為什麼呢?因為使用了2個執行緒,每個執行緒都會對全域性資源a進行改寫操作,導致出現問題。由於多執行緒共享程序的資源和位址空間,因此,在對這些公共資源進行操作時,為了防止這些公共資源出現異常的結果,必須考慮執行緒的同步和互斥問題。

利用lock

import threading

defjob1()

:global a,lock

lock.acquire(

)for i in

range(10

):a +=

1print

('job1'

,a) lock.release(

)def

job2()

:global a,lock

lock.acquire(

)#加鎖

for i in

range(10

):a +=

10print

('job2'

,a) lock.release(

)#解鎖

if __name__ ==

'__main__'

: a =

0 lock = threading.lock(

)#建立乙個lock

t1 = threading.thread(target=job1)

t2 = threading.thread(target=job2)

t1.start(

) t2.start(

) t1.join(

) t2.join(

)

執行結果:

job1 1

job1 2

job1 3

job1 4

job1 5

job1 6

job1 7

job1 8

job1 9

job1 10

job2 20

job2 30

job2 40

job2 50

job2 60

job2 70

job2 80

job2 90

job2 100

job2 110

通過acquire()release()函式來控制加鎖和解鎖。這樣每個thread對a進行改動期間,就不會有其它的thread插入進來改動a的值。

哦了。

python 多執行緒 鎖Lock

在上次講gil鎖的時候 位址 有講到gil鎖也會有釋放的時候,就會導致資料的錯誤讀訪問,10萬次左右可能不會有影響,然而量級大上去,結果就不再是零了。那麼如何解決這種問題呢?這裡引入lock from threading import lock a 0 lock lock def add fun g...

多執行緒 Lock

reentrantlock和synchronized區別 作用跟synchronized 鎖一樣 reentrantlock 底層是 cas 值,期望,預期 synchronized 底層鎖公升級 reentrantlock 可以trylock 嘗試鎖 a.如果在某時間段內獲取到鎖,就執行 b.如果...

C 多執行緒Lock

一.為什麼要lock,lock了什麼?當我們使用 執行緒的時候,效率最高的方式當然是 非同步,即各個執行緒同時執行,其間不相互依賴和等待。但當不同的執行緒都需要訪問某個資源的時候,就需要 同步機制 了,也就是說當對同乙個資源進行讀寫的時候,我們要使該資源在同一時刻只能被乙個執行緒操作,以確保每個操作...