我有一个比特的码,这是我无法找出正确。问题是,该程序是多线程和内有一点的代码,应如此同步我写这样的:

lock (lockObject)
{
   if (!Monitor.TryEnter(lockObject))
     Monitor.Wait(lockObject);

   //do stuff...
   Monitor.PulseAll(lockObject);
}
Monitor.Exit(lockObject);

我有问题的是,在某个时间点上的所有主题似乎是睡着 - 谁能告诉为什么?该程序继续运行沿无休止消耗几乎没有CPU,但没有做功 - 跟踪我发现,在一些点没有线程处于活动状态,但一大堆人正在睡觉的程序时。我大多知道错误(在开发商的情况下 - 总是)坐在0.5M,在显示器前 - 但我不能找出自己......也许在几分钟内;)

有人可以解释给我 - 在此先感谢

有帮助吗?

解决方案

是否有LockObjectlockObject之间的差?目前尚不清楚...

然而!如果它们是不同的对象,那么首先:你不能Wait对你没有锁...如果你指定超时TryEnter只会返回false。究竟是什么代码试图做?

如果没有更多的上下文中,它是不完全清楚什么PulseAllWait被设计做;例如,此处它们用于阻止队列时它太满(Wait),或释放它时,空间变得可用(PulseAll)等,这是难以调试线程的代码,而线程之间的充分的相互作用。

这听起来像你可能只需要:

lock (lockObject)
{
    // do stuff
}

有两个直接的问题,我可以看到;首先,它是不是很明显,你永远释放你把锁(即例外)。尽量只使用lockEnter/Exit - 它马上就

二;如果所有的线程调用Wait ......谁去唤醒他们?他们在等什么?由于提出:是的,他们将所有的睡眠无限期

其他提示

我assming第一锁定语句是一个错字,你的意思锁(lockObject)(小写)。

我觉得你在这里误解锁了一下。 IF块在你的代码永远不会是真实的。之所以是锁(lockObject)实际上exapands以下

Monitor.Enter(lockObject);
try {
...
} finally{ 
Monitor.Exit(lockObject);

所以你的时候撞块,如果你已经拥有的锁和TryEnter应该总是成功。

这是一个奇怪的设置。是“LockObject”一样“lockObject”?或者是一个错字?如果它们是相同的,那么你的设置是多余的,因为没有必要打电话给Monitor.TryEnter你已经锁定的东西。如果“LockObject”是不同的对象,那么为什么不将Monitor.Exit移动到锁定语句内?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top