C#等待并脉冲

C#等待并脉冲,c#,java,synchronization,C#,Java,Synchronization,在Java中,您可以等待每个对象,因此这种情况下可以编程: 线程A等待对象A 线程B等待对象B 线程C通知 线程A通知b 如果我使用C#的监视器,在我看来线程C只能唤醒b(或b和a),那么我如何使这种场景成为可能?您正在寻找监视器。Wait和监视器。Pulse方法。您正在寻找监视器。Wait和监视器。Pulse方法 如果我使用C的监视器,在我看来线程C只能唤醒b 为什么??它的线程C正在调用Monitor.Pulse(a),然后它将唤醒线程a,就像Java中的a.Pulse()一样 虽然有一些细

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

线程A等待对象A

线程B等待对象B

线程C通知

线程A通知b


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

您正在寻找
监视器。Wait
监视器。Pulse
方法。

您正在寻找
监视器。Wait
监视器。Pulse
方法

如果我使用C的监视器,在我看来线程C只能唤醒b

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

虽然有一些细微的区别,.NET中的
Monitor.Wait
/
Pulse
/
pulsell
与Java中的
Object.Wait
/
notify
非常相似。我强烈怀疑,无论您目前考虑的是什么差异,情况都不是这样,但是如果没有具体的代码,很难说

如果我使用C的监视器,在我看来线程C只能唤醒b

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


虽然有一些细微的区别,.NET中的
Monitor.Wait
/
Pulse
/
pulsell
与Java中的
Object.Wait
/
notify
非常相似。我强烈怀疑您目前考虑的任何差异都不是这样,但是如果没有具体的代码,很难说。

您似乎在想,因为C#synchronization函数是
Monitor
类的成员,所以您需要一个特殊的
Monitor
实例来使用它们,与Java不同,Java是
Java.lang.Object
类的成员,可用于所有对象

恰恰相反。根本没有
监视器
实例。在C#中,函数是静态方法,仍然可以处理任何对象。使用
监视器
类的唯一原因是防止
System.Object
被额外的成员弄乱(这些成员将显示在Intellisense建议列表等中)


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

您似乎认为,由于C#synchronization函数是
Monitor
类的成员,因此需要一个特殊的
Monitor
实例来使用它们,与Java不同,Java是
Java.lang.Object
类的成员,可用于所有对象

恰恰相反。根本没有
监视器
实例。在C#中,函数是静态方法,仍然可以处理任何对象。使用
监视器
类的唯一原因是防止
System.Object
被额外的成员弄乱(这些成员将显示在Intellisense建议列表等中)


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

我不确定我是否正确理解了您的意思,但我看不出有任何问题。以下代码有意简化,没有类,也没有声明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
}
如需进一步帮助,请提供更多详细信息。
阅读C#中监视器的工作原理。

我不确定我是否正确理解您的意思,但我看不出任何问题。以下代码有意简化,没有类,也没有声明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
}
如需进一步帮助,请提供更多详细信息。
阅读C#中Monitor的工作原理。

通常你会从代码开始……当它是抽象的时,这个问题更容易理解,至少在我看来,什么是等效的Java代码?@OfekRon:实际上恰恰相反。我很确定你误解了.NET中的
Monitor
是如何工作的-如果你产生了Java代码示例和类似的C代码,你认为它们工作方式不同,我们可以给你更多帮助。通常你会从代码开始…当问题的摘要,至少在我看来,什么是等效的Java代码?@OfekRon:事实上恰恰相反。我很确定你误解了.NET中的
Monitor
是如何工作的-如果你制作了Java示例代码和类似的C代码,并且你认为它们的工作方式不同,我们可以为你提供更多帮助。你是对的,我没有注意到这些方法被赋予了一个对象作为参数来等待。@OfekRon:值得注意的是,如果你试图为这个问题提供一个完整的例子,你会很快遇到这个问题:)你是对的,我没有注意到这些方法被赋予了一个对象作为参数来等待。@OfekRon:值得注意的是,如果你试图为这个问题提供一个完整的例子,你会很快遇到这个问题:)