我有一些代码,我无法正确理解。问题是程序是多线程的,里面有一些代码应该同步,所以我写了这个:
lock (lockObject)
{
if (!Monitor.TryEnter(lockObject))
Monitor.Wait(lockObject);
//do stuff...
Monitor.PulseAll(lockObject);
}
Monitor.Exit(lockObject);
我遇到的问题是,在某个时间点,所有线程似乎都在休眠 - 谁能告诉我为什么?该程序一直在无休止地运行,几乎不消耗任何 cpu,但没有完成任何工作 - 在跟踪该程序时,我发现在某些时候没有线程处于事件状态,但很多线程都在休眠。我知道大部分错误(如果是开发人员 - 总是)位于显示器前 0.5 米处 - 但我自己无法弄清楚......可能在几分钟内;)
有人可以向我解释一下吗 - 提前致谢。
请您参考如下方法:
我认为第一个 lock 语句是错字,你的意思是 lock(lockObject)(小写)。
我认为您在这里对锁有一点误解。代码中的 if block 永远不会为真。原因是 lock(lockObject) 实际上扩展为以下内容
Monitor.Enter(lockObject);
try {
...
} finally{
Monitor.Exit(lockObject);
因此,当您点击 if block 时,您已经拥有锁并且 TryEnter 应该总是成功。
