Python:使用threading模塊實現多線程編程五[死鎖的造成]

前一篇文章Python:使用threading模塊實現多線程編程四[使用Lock互斥鎖]咱們已經開始涉及到如何使用互斥鎖來保護咱們的公共資源了,如今考慮下面的狀況--算法

        若是有多個公共資源,在線程間共享多個資源的時候,若是兩個線程分別佔有一部分資源而且同時等待對方的資源,這會引發什麼問題?編程

死鎖概念多線程

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

Python代碼函數

  1. '''''
  2. Created on 2012-9-8
  3. @author: walfred
  4. @module: thread.TreadTest5
  5. '''
  6. import threading 
  7. counterA = 0
  8. counterB = 0
  9. mutexA = threading.Lock() 
  10. mutexB = threading.Lock() 
  11. class MyThread(threading.Thread): 
  12. def __init__(self): 
  13.         threading.Thread.__init__(self) 
  14. def run(self): 
  15. self.fun1() 
  16. self.fun2() 
  17. def fun1(self): 
  18. global mutexA, mutexB 
  19. if mutexA.acquire(): 
  20. print "I am %s , get res: %s" %(self.name, "ResA") 
  21. if mutexB.acquire(): 
  22. print "I am %s , get res: %s" %(self.name, "ResB") 
  23.                 mutexB.release() 
  24.         mutexA.release()  
  25. def fun2(self): 
  26. global mutexA, mutexB 
  27. if mutexB.acquire(): 
  28. print "I am %s , get res: %s" %(self.name, "ResB") 
  29. if mutexA.acquire(): 
  30. print "I am %s , get res: %s" %(self.name, "ResA") 
  31.                 mutexA.release() 
  32.         mutexB.release()  
  33. if __name__ == "__main__": 
  34. for i in range(0, 100): 
  35.         my_thread = MyThread() 
  36.         my_thread.start()     

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

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線程

        能夠看到,程序已經掛起在那兒了,這種現象咱們就稱之爲」死鎖「。htm

避免死鎖進程

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

相關文章
相關標籤/搜索