2013-01-19 140 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

我认为它总是一样的,线程优先级在内核中实现,它只是改变了“线程调度器”为每个线程分配时隙的方式(据我所知) –