2013-01-19 80 views
1

在.NET中,假設thread A鎖定一個對象。同時,thread Bthread C被阻止,並等待對象被thread A解鎖。鎖定/多線程監視器

現在,thread A解鎖對象。哪個線程(B或C)將在下一個選擇?它是如何確定的?

+1

您無法確定將選擇哪個線程。此外,有時系統可能會選擇線程B,而有時系統會選擇線程C. – Ikaso

+0

但是,系統性能取決於系統選擇的方式。如果線程持續偏向於另一線程,線程可能會捱餓。 – flup

+0

@flup - 如果設計得好,這不應該發生。 '餓死'的線程將被阻塞,併爲那些可以取得進展的CPU騰出空間。這是有點全面。 –

回答

5

簡短的回答是,這是不確定性 - 即你永遠不知道。

中等的答案是,等待獲取鎖的線程被放入「就緒隊列」,這是FIFO,但你不能依賴它。

長時間的回答是,就緒隊列中的線程可以「借用」來運行稱爲APC的小塊作業(Asynchronous Procedure Calls)發生這種情況時,它們將失去其在隊列中的位置,並且當APC完成時,它們會放回就緒隊列 - 但最後。

所以,回到簡短的答案:你永遠不知道。

2

它應該是第一個試圖獲得鎖(如隊列),See more here

+1

假設它們具有相同的優先級?或者總是? – flup

+0

我認爲它總是一樣的,線程優先級在內核中實現,它只是改變了「線程調度器」爲每個線程分配時隙的方式(據我所知) –