2012-10-21 67 views
2

這個僞碼多線程併發運行導致死鎖:資源池僵局

Resource res1 = pool.get(); 
... 
Resource res2 = pool.get(); 
... 
pool.release(res2); 
pool.release(res1); 

那是一個預期的行爲? (我猜是這樣)

如果池的大小是線程數的兩倍,死鎖似乎不會發生 - 該語句是否正確?

計算機科學中存在這種僵​​局的「科學」名稱嗎?將欣賞一些鏈接。

謝謝

回答

1

假設您有兩個線程和兩個資源。

線程A執行res1 = pool.get()並獲取一個資源。線程B執行res1 = pool.get()並獲取一個資源。現在游泳池已經耗盡,所以線程都不能完成res2 = pool.get()

問題就沒有了,如果你有一個備用的資源(即至少n+1資源n線程),因爲在這種情況下,一個線程可以保證它們獲得兩種資源,光潔度,從而爲其他線程釋放足夠的資源使用。增加資源數量可以提高並行性;資源的數量是線程的兩倍,每個線程都可以在沒有阻塞的情況下獲取資源,因此所有線程都可以並行執行。

AFAIK這簡直叫做「死鎖」,因爲它本質上是一個教科書中的現象例子。兩項任務現在正在彼此等待釋放必要的資源。

+0

感謝n + 1的線索:) –