Python多線程編程(五):死結的形成

來源:互聯網
上載者:User
前一篇文章Python:使用threading模組實現多線程編程四[使用Lock互斥鎖]我們已經開始涉及到如何使用互斥鎖來保護我們的公用資源了,現在考慮下面的情況–

如果有多個公用資源,線上程間共用多個資源的時候,如果兩個線程分別佔有一部分資源並且同時等待對方的資源,這會引起什麼問題?

死結概念

所謂死結: 是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死結狀態或系統產生了死結,這些永遠在互相等待的進程稱為死結進程。 由於資源佔用是互斥的,當某個進程提出申請資源後,使得有關進程在無外力協助下,永遠分配不到必需的資源而無法繼續運行,這就產生了一種特殊現象死結。

代碼如下:


'''
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()

代碼中展示了一個線程的兩個功能函數分別在擷取了一個競爭資源之後再次擷取另外的競爭資源,我們看運行結果:

代碼如下:


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


可以看到,程式已經掛起在那兒了,這種現象我們就稱之為”死結“。

避免死結

避免死結主要方法就是:正確有序的分配資源,避免死結演算法中最有代表性的演算法是Dijkstra E.W 於1968年提出的銀行家演算法。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.