Skip to main content
 首页 » 编程设计

Monitor 类的 C# 多线程问题之可能的生命锁

2024年02月03日25xxx_UU

我有一些代码,我无法正确理解。问题是程序是多线程的,里面有一些代码应该同步,所以我写了这个:

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 应该总是成功。