在.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腾出空间。这是有点全面。 –