C#等待和脉冲

时间:2012-07-04 18:18:19

标签: c# java synchronization

在Java中,您可以等待每个对象,因此可以编程这种情况:

线程A等待对象a

线程B在对象b上等待

线程C通知

线程A通知b

如果我使用C#的监视器,在我看来,线程C只能唤醒b(或b和a),那么我如何才能使这种情况成为可能呢?

4 个答案:

答案 0 :(得分:3)

  

如果我使用C#的Monitor,在我看来,Thread C只能唤醒b /

为什么呢?它正在调用Monitor.Pulse(a)然后它将唤醒线程A,就像Java中的a.pulse()一样。

虽然存在一些细微差别,但.NET中的Monitor.Wait / Pulse / PulseAllObject.wait / {{1}非常相似Java中的/ notify。我强烈怀疑你目前正在考虑的不同之处并非如此,但如果没有具体的代码,很难说。

答案 1 :(得分:1)

您正在寻找Monitor.WaitMonitor.Pulse方法。

答案 2 :(得分:1)

您似乎在想,因为C#同步函数是Monitor类的成员,您需要一个特殊的Monitor实例来使用它们,而Java则是它们的成员。 java.lang.Object类,适用于所有对象。

恰恰相反。根本没有Monitor个实例。在C#中,函数是静态方法,并且仍然适用于任何对象。 Monitor课程的唯一原因是防止System.Object混乱有额外的成员(会出现在Intellisense建议列表中等)。

但是,我发现使用Pulse的代码通常具有隐藏的竞争条件。有更好的方法可以在线程之间进行同步,从而使编写可靠的代码变得更容易。

答案 3 :(得分:0)

我不确定我是否正确理解你,但我没有看到任何问题。以下代码是有意简化的,没有类和a和b的声明:

public void ThreadARunner()
{
    lock(a)
        Monitor.Wait(a); //waits here until thread C pulses, releasing the lock on a
    lock(b)
        Monitor.Pulse(b); //wakes up thread B
}

public void ThreadBRunner()
{
    lock(b)
        Monitor.Wait(b); //waits here until thread A pulses, releasing the lock on b
}

public void ThreadCRunner()
{
    lock(a)
        Monitor.Pulse(a); //wakes up thread a
}

如需进一步帮助,请提供更多详细信息。 请阅读here,了解Monitor如何在C#中工作。