#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] #
最後才讓主線程等待所有子執行緒結束而結束。這樣才能實現非同步操作。
(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先執行...