考慮這種狀況:若是一個線程遇到鎖嵌套的狀況該怎麼辦,這個嵌套是指當我一個線程在獲取臨界資源時,又須要再次獲取。python
根據這種狀況,代碼以下:ide
Python代碼ui
- '''''
- Created on 2012-9-8
- @author: walfred
- @module: thread.ThreadTest6
- '''
- import threading
- import time
- counter = 0
- mutex = threading.Lock()
- class MyThread(threading.Thread):
- def __init__(self):
- threading.Thread.__init__(self)
- def run(self):
- global counter, mutex
- time.sleep(1);
- if mutex.acquire():
- counter += 1
- print "I am %s, set counter:%s" % (self.name, counter)
- if mutex.acquire():
- counter += 1
- print "I am %s, set counter:%s" % (self.name, counter)
- mutex.release()
- mutex.release()
- if __name__ == "__main__":
- for i in range(0, 200):
- my_thread = MyThread()
- my_thread.start()
這種狀況的代碼運行狀況以下:線程
I am Thread-1, set counter:1資源
以後就直接掛起了,這種狀況造成了最簡單的死鎖。it
那有沒有一種狀況能夠在某一個線程使用互斥鎖訪問某一個競爭資源時,能夠再次獲取呢?在Python中爲了支持在同一線程中屢次請求同一資源,python提供了「可重入鎖」:threading.RLock。這個RLock內部維護着一個Lock和一個counter變量,counter記錄了acquire的次數,從而使得資源能夠被屢次require。直到一個線程全部的acquire都被release,其餘的線程才能得到資源。上面的例子若是使用RLock代替Lock,則不會發生死鎖:class
代碼只需將上述的:thread
Python代碼import
- mutex = threading.Lock()
替換成:require
Python代碼
- mutex = threading.RLock()
便可。