python 執行緒鎖

2021-08-14 20:05:58 字數 2042 閱讀 1713

由於執行緒之間隨機排程:某執行緒可能在執行n條後,cpu接著執行其他執行緒。為了多個執行緒同時操作乙個記憶體中的資源時不產生混亂,我們使用鎖。

lock(指令鎖)是可用的最低階的同步指令。lock處於鎖定狀態時,不被特定的執行緒擁有。lock包含兩種狀態——鎖定和非鎖定,以及兩個基本的方法。

可以認為lock有乙個鎖定池,當執行緒請求鎖定時,將執行緒至於池中,直到獲得鎖定後出池。池中的執行緒處於狀態圖中的同步阻塞狀態。

建立鎖:

lock=threading.lock()   

cond=threading.condition(lock=lock)

鎖的方法:

cond.acquire():  獲得鎖

cond.wait()           等待通知

cond.notify()        通知正在等待的鎖

cond.notify_all()   通知所有正在等待的鎖

cond.release()       釋放鎖

例項:

當多執行緒爭奪鎖時,允許第乙個獲得鎖的執行緒進入臨街區,並執行**。
所有之後到達的執行緒將被阻塞,直到第乙個執行緒執行結束,退出臨街區,
並釋放鎖。需要注意,那些阻塞的執行緒是沒有順序的。

import threading,time

lista=

class huofu(threading.thread):

def run(self):

while true:

condchi.acquire() #給吃貨上鎖怕他偷吃饅頭

if len(lista)==0:

for i in range(1,11): #生產饅頭

print("正在生產第{}個饅頭".format(i))

time.sleep(1)

condchi.notify_all() #饅頭已經生產完畢,通知吃貨準備吃饅頭

condchi.release() #給吃貨解鎖

class chihuo(threading.thread):

def __init__(self,name):

threading.thread.__init__(self)

self.name=name

def run(self):

mantou=

while true:

condchi.acquire() #吃貨搶鎖誰搶到誰進去吃饅頭

if len(lista)>0:

mantou=lista.pop() #吃饅頭

time.sleep(1)

else:

condhuo.acquire() #獲得夥伕的鎖

condhuo.notify() #通知夥伕準備做饅頭

condhuo.release() #釋放夥伕的鎖

condchi.wait() #沒饅頭了吃貨等待

condchi.release() #釋放吃貨的鎖

if mantou not in lista:

print("{}在吃第{}個饅頭".format(self.name,mantou))

lock1=threading.lock()

condhuo=threading.condition(lock1)

lock2=threading.lock()

condchi=threading.condition(lock2)

huofu1=huofu()

chihuo1=chihuo("handao") #生成吃貨一

chihuo2=chihuo("tanzhenghua") #生成吃貨二

chihuo3=chihuo("laowang") #吃貨三

huofu1.start()

chihuo1.start()

chihuo2.start()

chihuo3.start()

Python(執行緒鎖)

1.1 多個執行緒對同乙個資料進行修改時,可能會出現不可預料的情況.2.1 例項化物件方式實現執行緒鎖 import threading 銀行存錢和取錢 def add lock global money 宣告money為全域性變數 for i in range 1000000 2.操作變數之前進行...

python執行緒互斥鎖 Python多執行緒與互斥鎖

多執行緒 threading python的thread模組是 較底層的模組,python的threading 模組是對thread做了 些包裝的,可以更加 便的被使 1.使 threading模組 from threading import thread 匯入模組 t thread target ...

python 多執行緒 鎖

參考 python cookbook 12章 啟動和停止執行緒 start 啟動執行緒 is alive 判斷是否已經結束 join 請求連線某個執行緒,等待該執行緒結束,才退出join函式 daemon引數,守護執行緒,該執行緒無法被連線,主線程結束後自動銷毀。2.7不適用 終止執行緒 需要自己構...