锁定/监视多个线程

soc*_*ket 1 .net c# multithreading locking monitor

在.NET中,假设thread A锁定一个对象.同时,thread Bthread C被阻塞并等待对象由被解锁thread A.

现在,thread A解锁了对象.接下来会选择哪个线程(B或C)?怎么决定?

Nic*_*ler 5

简短的回答是它是非确定性的 - 即你永远不会知道.

中等答案是等待获取锁的线程被放入"就绪队列",即FIFO,但你不能依赖它.

很长的答案是,就绪队列中的线程可以"借用"来运行称为APC的小块工作(Asynchronous Procedure Calls)当发生这种情况时,它们会在队列中失去位置,当APC完成时,它们会被放回准备状态队列 - 但最后.

所以,回到简短的回答:你永远不会知道.