在.NET中,假設thread A
鎖定一個對象。同時,thread B
和thread C
被阻止,並等待對象被thread A
解鎖。鎖定/多線程監視器
現在,thread A
解鎖對象。哪個線程(B或C)將在下一個選擇?它是如何確定的?
在.NET中,假設thread A
鎖定一個對象。同時,thread B
和thread C
被阻止,並等待對象被thread A
解鎖。鎖定/多線程監視器
現在,thread A
解鎖對象。哪個線程(B或C)將在下一個選擇?它是如何確定的?
簡短的回答是,這是不確定性 - 即你永遠不知道。
中等的答案是,等待獲取鎖的線程被放入「就緒隊列」,這是FIFO,但你不能依賴它。
長時間的回答是,就緒隊列中的線程可以「借用」來運行稱爲APC的小塊作業(Asynchronous Procedure Calls
)發生這種情況時,它們將失去其在隊列中的位置,並且當APC完成時,它們會放回就緒隊列 - 但最後。
所以,回到簡短的答案:你永遠不知道。
它應該是第一個試圖獲得鎖(如隊列),See more here
假設它們具有相同的優先級?或者總是? – flup
我認爲它總是一樣的,線程優先級在內核中實現,它只是改變了「線程調度器」爲每個線程分配時隙的方式(據我所知) –
您無法確定將選擇哪個線程。此外,有時系統可能會選擇線程B,而有時系統會選擇線程C. – Ikaso
但是,系統性能取決於系統選擇的方式。如果線程持續偏向於另一線程,線程可能會捱餓。 – flup
@flup - 如果設計得好,這不應該發生。 '餓死'的線程將被阻塞,併爲那些可以取得進展的CPU騰出空間。這是有點全面。 –