在Java中,您可以等待每个对象,因此可以编程这种情况:
线程A等待对象a
线程B在对象b上等待
线程C通知
线程A通知b
如果我使用C#的监视器,在我看来,线程C只能唤醒b(或b和a),那么我如何才能使这种情况成为可能呢?
答案 0 :(得分:3)
如果我使用C#的Monitor,在我看来,Thread C只能唤醒b /
为什么呢?它正在调用Monitor.Pulse(a)
然后它将唤醒线程A,就像Java中的a.pulse()
一样。
虽然存在一些细微差别,但.NET中的Monitor.Wait
/ Pulse
/ PulseAll
与Object.wait
/ {{1}非常相似Java中的/ notify
。我强烈怀疑你目前正在考虑的不同之处并非如此,但如果没有具体的代码,很难说。
答案 1 :(得分:1)
您正在寻找Monitor.Wait
和Monitor.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#中工作。