# 所謂死鎖: 是指兩個或兩個以上的程序或執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,# 若無外力作用,它們都將無法推進下去。
# 此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。
# 解決方案:將所有鎖改編成遞迴鎖rlock# 在python中為了支援在同一執行緒中多次請求同一資源,python提供了可重入鎖rlock。
# 這個rlock內部維護著乙個lock和乙個counter變數,counter記錄了acquire的次數,從而使得資源可以被多次require。
# 直到乙個執行緒所有的acquire都被release,其他的執行緒才能獲得資源。上面的例子如果使用rlock代替lock,則不會發生死鎖。
# 不要瞧不起最原始的序列,那是解決執行緒安全問題最原始最有效的方法
# rlock = threading.rlock()
# rlock 代替所有mutex
import threadingimport time
# mutexa = threading.lock()
# mutexb = threading.lock()
rlock = threading.rlock()
class mythread(threading.thread):
def __init__(self):
threading.thread.__init__(self)
def run(self):
self.fun1()
self.fun2()
def fun1(self):
rlock.acquire() # 如果鎖被占用,則阻塞在這裡,等待鎖的釋放
print ("i am %s , get res: %s---%s" %(self.name, "resa",time.time()))
rlock.acquire()
print ("i am %s , get res: %s---%s" %(self.name, "resb",time.time()))
rlock.release()
rlock.release()
def fun2(self):
rlock.acquire()
print ("i am %s , get res: %s---%s" %(self.name, "resb",time.time()))
time.sleep(0.2)
rlock.acquire()
print ("i am %s , get res: %s---%s" %(self.name, "resa",time.time()))
rlock.release()
rlock.release()
if __name__ == "__main__":
print("start---------------------------%s"%time.time())
for i in range(0, 10):
my_thread = mythread()
my_thread.start()
造成死鎖的原因和解決方案
計算機系統中,如果系統的資源分配策略不當,更常見的可能是程式設計師寫的程式有錯誤等,則會導致程序因競爭資源不當而產生死鎖的現象。產生死鎖的原因主要是 1 因為系統資源不足。2 程序執行推進的順序不合適。3 資源分配不當等。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就...
C 中async的死鎖分析和解決方案
如果你開發乙個簡單的windows form程式,點選button去使用async非同步獲取乙個資料,然後顯示在label上,類似這樣的 private void button1 click object sender,eventargs e public async task getcontent...
Oracle Job 死鎖解決方案
oracle執行定時job時,經常會遇到job意外死鎖,或者一些job執行的程式有對外的介面,當網路中斷或不穩定時,造成job死鎖,占用資源,以下為解決方法 如果不想job釋放後馬上又重新執行,請先將job在資料庫中broken 1.檢視正在執行job的job id sid serial spid資...