Python多線程編程(五):死鎖的形成
前一篇文章Python:使用threading模塊實現(xiàn)多線程編程四[使用Lock互斥鎖]我們已經(jīng)開始涉及到如何使用互斥鎖來保護我們的公共資源了,現(xiàn)在考慮下面的情況–
如果有多個公共資源,在線程間共享多個資源的時候,如果兩個線程分別占有一部分資源并且同時等待對方的資源,這會引起什么問題?
死鎖概念
所謂死鎖: 是指兩個或兩個以上的進程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進下去。此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。 由于資源占用是互斥的,當某個進程提出申請資源后,使得有關進程在無外力協(xié)助下,永遠分配不到必需的資源而無法繼續(xù)運行,這就產(chǎn)生了一種特殊現(xiàn)象死鎖。
'''
Created on 2012-9-8
@author: walfred
@module: thread.TreadTest5
'''
import threading
counterA = 0
counterB = 0
mutexA = threading.Lock()
mutexB = threading.Lock()
class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
self.fun1()
self.fun2()
def fun1(self):
global mutexA, mutexB
if mutexA.acquire():
print "I am %s , get res: %s" %(self.name, "ResA")
if mutexB.acquire():
print "I am %s , get res: %s" %(self.name, "ResB")
mutexB.release()
mutexA.release()
def fun2(self):
global mutexA, mutexB
if mutexB.acquire():
print "I am %s , get res: %s" %(self.name, "ResB")
if mutexA.acquire():
print "I am %s , get res: %s" %(self.name, "ResA")
mutexA.release()
mutexB.release()
if __name__ == "__main__":
for i in range(0, 100):
my_thread = MyThread()
my_thread.start()
代碼中展示了一個線程的兩個功能函數(shù)分別在獲取了一個競爭資源之后再次獲取另外的競爭資源,我們看運行結果:
I am Thread-1 , get res: ResA
I am Thread-1 , get res: ResB
I am Thread-2 , get res: ResAI am Thread-1 , get res: ResB
可以看到,程序已經(jīng)掛起在那兒了,這種現(xiàn)象我們就稱之為”死鎖“。
避免死鎖
避免死鎖主要方法就是:正確有序的分配資源,避免死鎖算法中最有代表性的算法是Dijkstra E.W 于1968年提出的銀行家算法。
相關文章
使用pandas實現(xiàn)csv/excel sheet互相轉(zhuǎn)換的方法
今天小編就為大家分享一篇使用pandas實現(xiàn)csv/excel sheet互相轉(zhuǎn)換的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
python使用tkinter調(diào)整label背景顏色的測試
這篇文章主要介紹了python使用tkinter調(diào)整label背景顏色的測試方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
Python實現(xiàn)將n個點均勻地分布在球面上的方法
這篇文章主要介紹了Python實現(xiàn)將n個點均勻地分布在球面上的方法,涉及Python繪圖的技巧與相關數(shù)學函數(shù)的調(diào)用,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03
python讀取excel指定列數(shù)據(jù)并寫入到新的excel方法
今天小編就為大家分享一篇python讀取excel指定列數(shù)據(jù)并寫入到新的excel方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Python圖像處理庫PIL的ImageFilter模塊使用介紹
這篇文章主要介紹了Python圖像處理庫PIL的ImageFilter模塊使用介紹,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02
使用卷積神經(jīng)網(wǎng)絡(CNN)做人臉識別的示例代碼
這篇文章主要介紹了使用卷積神經(jīng)網(wǎng)絡(CNN)做人臉識別的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
python正則表達式中匹配次數(shù)與貪心問題詳解(+??*)
正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配,下面這篇文章主要給大家介紹了關于python正則表達式中匹配次數(shù)與貪心問題(+??*)的相關資料,需要的朋友可以參考下2022-10-10

