由於執行緒之間隨機排程:某執行緒可能在執行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不適用 終止執行緒 需要自己構...