在 .NET 中,假设 thread A
锁定了一个对象。同时,线程B
和线程C
被阻塞,等待线程A
解锁对象。
现在,线程 A
解锁了对象。接下来将选择哪个线程(B 或 C)?它是如何确定的?
最佳答案
简短的回答是它是不确定的——也就是说,你永远不知道。
中等答案是等待获取锁的线程被放入“就绪队列”,即 FIFO,但您不能依赖它。
长答案是,可以“借用”就绪队列中的线程来运行称为 APC (Asynchronous Procedure Calls
) 的小块工作。发生这种情况时,它们会失去它们在队列中的位置,当 APC 完成时,它们被放回就绪队列 - 但在最后。
所以,回到简短的回答:你永远不知道。
关于c# - 多线程锁定/监控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14416853/