day47 執行緒 鎖和死鎖

2022-08-24 10:06:10 字數 4373 閱讀 8192

#

1、鎖:防止多個執行緒同時讀寫某一塊記憶體區域。

from threading import

thread

from threading import

lock

deffunc():

global

n lock.acquire()

n -= 1 #

每乙個執行緒在運算元據之前先拿到鑰匙,操作完成之後,釋放鑰匙。

lock.release()

n = 10t_list =

lock =lock()

for i in range(10): #

先開啟所有子執行緒。

t = thread(target=func)

t.start()

[t.join()

for t in t_list] #

最後才讓主線程等待所有子執行緒結束而結束。這樣才能實現非同步操作。

print

(n)#

2、rlock遞迴鎖可以acquire多次和對應地release多次,lock互斥鎖只能acquire和release一次。

from threading import

rlock

lock =rlock()

lock.acquire()

lock.acquire()

lock.acquire()

print('

123'

)lock.release()

lock.release()

lock.release()

#123

#3、死鎖:在不同的執行緒當中(eat和eat1),恰好要對兩個資料(筷子和面)進行操作,使用lock會產生死鎖,資料不安全。

#科學家吃麵:吃麵需要同時有筷子和面才能吃到,a吃完麵把筷子和面放下讓給b,b拿到筷子和面才能吃。

#下面例子的結果是有人拿到面拿不到筷子,有人拿到筷子拿不到面,形成死鎖。

from threading import

lock

from threading import

thread

import

time

defeat(name):

kz_lock.acquire()

print('

%s拿到筷子了

'%name)

m_lock.acquire()

print('

%s拿到面了

'%name)

print('

%s可以吃麵了

'%name)

time.sleep(1)#

因為cpu排程是無序的,設定睡眠1秒是為了把問題更好的發掘出來,否則就算執行很多次,出現問題是小概率事件。

m_lock.release()

kz_lock.release()

defeat1(name):

m_lock.acquire()

print('

%s拿到面了

'%name)

kz_lock.acquire()

print('

%s拿到筷子了

'%name)

print('

%s可以吃麵了

'%name)

kz_lock.release()

m_lock.release()

kz_lock = lock() #

筷子鎖m_lock = lock() #

面鎖t = thread(target=eat,args=('

tom'

,))t.start()

t1 = thread(target=eat1,args=('

marry

',))

t1.start()

t2 = thread(target=eat,args=('

jack

',))

t2.start()

t3 = thread(target=eat1,args=('

alex

',))

t3.start()

#tom拿到筷子了

#tom拿到面了

#tom可以吃麵了

#jack拿到筷子了

#marry拿到面了

#rlock解決死鎖問題:

from threading import

rlock

from threading import

thread

import

time

defeat(name):

kz_lock.acquire()

print('

%s拿到筷子了

'%name)

m_lock.acquire()

print('

%s拿到面了

'%name)

print('

%s可以吃麵了

'%name)

time.sleep(1)

m_lock.release()

#後面拿到的鑰匙先還。

kz_lock.release() #

前面拿到的鑰匙後還。

defeat1(name):

m_lock.acquire()

print('

%s拿到面了

'%name)

kz_lock.acquire()

print('

%s拿到筷子了

'%name)

print('

%s可以吃麵了

'%name)

kz_lock.release()

m_lock.release()

kz_lock = m_lock = rlock() #

筷子鎖和面鎖是同一把鎖

t = thread(target=eat,args=('

tom'

,))t.start()

t1 = thread(target=eat1,args=('

marry

',))

t1.start()

t2 = thread(target=eat,args=('

jack

',))

t2.start()

t3 = thread(target=eat1,args=('

alex

',))

t3.start()

#tom拿到筷子了

#tom拿到面了

#tom可以吃麵了

#marry拿到面了

#marry拿到筷子了

#marry可以吃麵了

#jack拿到筷子了

#jack拿到面了

#jack可以吃麵了

#alex拿到面了

#alex拿到筷子了

#alex可以吃麵了

#rlock解決死鎖問題(更加簡潔的寫法):

from threading import

rlock

from threading import

thread

defeat(name):

lock.acquire()

print('

%s拿到筷子了

'%name)

lock.acquire()

print('

%s拿到面了

'%name)

print('

%s可以吃麵了

'%name)

lock.release()

lock.release()

defeat1(name):

lock.acquire()

print('

%s拿到面了

'%name)

lock.acquire()

print('

%s拿到筷子了

'%name)

print('

%s可以吃麵了

'%name)

lock.release()

lock.release()

lock =rlock()

t = thread(target=eat,args=('

tom'

,))t.start()

t1 = thread(target=eat1,args=('

marry

',))

t1.start()

t2 = thread(target=eat,args=('

jack

',))

t2.start()

t3 = thread(target=eat1,args=('

alex

',))

t3.start()

實習日記 Day47

每天都在補前一天欠下的日記?昨天補的是前天的,今天就要補昨天的 昨天都做了些什麼呢?才過去一天而已,竟然有一種 昨日之日,恍若隔世 的感覺,簡要回顧一下,分為昨天的苦澀和昨天的甜吧 昨天讓我感到痛苦的是再一次被push做知識分享的ppt,和之前的 催 不同,這一次的 催 帶著deadline。從第一...

前端 學習筆記day47 其他標籤

標籤的屬性都是屬性名 屬性值的形式 每乙個標籤都有 三個基本屬性 id 表示該標籤的唯一標識,不能重複 class style 兩者都是用來顯示文字內容的,但是div標籤是塊級標籤,而span是行內標籤 內聯標籤 doctype html html head meta charset utf 8 t...

牛客 C 刷題day47

1.不能認為是原子操作,a是全域性變數,在記憶體中,則 a一般被分為從記憶體取a到暫存器 回寫到記憶體三步.兩個執行緒併發執行以下 假設a是全域性變數,那麼以下輸出 哪個是可能的?int a 1 void foo 解析假設執行緒x和y同時執行,x和y可隨時被搶占,a的初始值為1 a 3,2 y先執行...