2013-01-11 72 views
2

我有3個線程,它們當前正在同時運行。模擬線程上的死鎖

def f1(): 
    print "running first thread\n" 
    sleep(10) 

def f2(): 
    print "running second thread\n" 
    sleep(10) 

def f3(): 
    print "running third thread\n" 
    sleep(10) 


if __name__ == "__main__": 
    thread1 = Thread(target = f1) 
    thread2 = Thread(target = f2) 
    thread3 = Thread(target = f3) 

    try: 
     thread1 = Thread(target = f1) 
     thread1.start() 

     thread2 = Thread(target = f2) 
     thread2.start() 

     thread3 = Thread(target = f3) 
     thread3.start() 

     while(thread1.isAlive() or thread2.isAlive() or thread3.isAlive()): 
      thread1.join() 
      thread2.join() 
      thread3.join() 
    except (KeyboardInterrupt, SystemExit): 
     sys.exit() 

如何模擬死鎖?另外,我如何讓每個線程都運行在另一個線程之後?我也可以列出當前在腳本中運行的所有線程嗎?或給他們優先?

+0

你試圖模擬一個死鎖(如標題詢問),或實際上創建一個死鎖(正如身體問)?而且,如果是後者,你是否僅僅想要一個在現實生活中永遠不會出現的微不足道的僵局,或者是一個有點現實的場景的最簡單的例子? – abarnert

+0

對於初學者,你可能想要一個鎖,你可以在某處死鎖:http://effbot.org/zone/thread-synchronization.htm – paulsm4

+0

@abarnert;我其實需要模擬一個死鎖,很抱歉不該編輯我的帖子。 – moenad

回答

2

如何模擬死鎖?

所有死鎖意味着一個或多個線程被阻止進行任何進程,因此您可以使用單個線程來模擬它。只需在sleep(10)周圍放置一個while True:即可。

在實際情況下,您通常會有兩個線程同時阻止彼此進程。例如,也許他們已經以相反的順序取得了一對鎖,所以線程1不會釋放鎖1,直到獲得鎖2,但線程2在鎖1之前不會釋放鎖2.因此,它可能最好是通過讓兩個線程永久阻塞來模擬它。

如果要真正創建一個僵局,最簡單的方法是讓線程相互字面上塊:添加thread2.join()f1,並thread1.join()f2。然後f1無法完成,直到f2呢,f2無法完成,直到f1呢,所以沒有人能完成。

但是,如果要創建一個現實的死鎖,幾乎肯定會使用像threading.Lock這樣的同步對象來執行類似上述雙鎖方案的操作。

另外,我怎麼能有其他的以後每個線程運行?

那麼,簡單的方法是不首先使用線程。但如果你真的想要的,只是這樣做:

thread1.start() 
thread1.join() 
thread2.start() 
thread2.join() 
thread3.start() 
thread3.join() 

也可以我列出當前在我的腳本運行的所有線程?

請參閱threading.enumerate()。除調試目的外,您通常不想使用它;如果您希望稍後訪問它們(如您所做的那樣),請在創建它們時跟蹤這些線索。

,或給他們的優先級?

由於文檔說:

目前,沒有重點,沒有線程組和線程不能被破壞,停止,暫停,恢復或中斷。

如果你想要這個,你必須跨出的threading和,例如,通過​​,win32api等使用原生API

0

在編寫代碼之前,應該先回顧一下deadlock的外觀。這種情況在應用程序試圖查看一些可以避免的examples時是不可取的。