在Java中,你可以等待每个对象,所以这种情况是可能的方案:在对象C#等待和脉冲
线程A等待的对象
线程B等待b
关于b A
线程A分配时通知线程C-分配时通知
如果我使用C#的监控,在我看来,该线程C可才醒悟b向上(或b和A),然后怎么办我是个可能有这种情况吗?
在Java中,你可以等待每个对象,所以这种情况是可能的方案:在对象C#等待和脉冲
线程A等待的对象
线程B等待b
关于b A
线程A分配时通知线程C-分配时通知
如果我使用C#的监控,在我看来,该线程C可才醒悟b向上(或b和A),然后怎么办我是个可能有这种情况吗?
你似乎认为,因为C#同步功能是Monitor
类的成员,你需要一个特殊的Monitor
实例使用它们,而相比之下,Java的,他们是java.lang.Object
类的成员,并适用于所有对象。
恰恰相反。根本没有Monitor
实例。在C#中,这些函数是静态方法,并且仍然适用于任何对象。 Monitor
类的唯一原因是为了防止System.Object
与额外的成员混淆(这将显示在Intellisense建议列表中,等等)。
但是,我发现代码使用Pulse
通常有隐藏的竞争条件。有更好的方法可以让线程之间进行同步,使编写可靠的代码变得更容易。
是的,那正是我想的......谢谢! –
您正在查找的Monitor.Wait
和Monitor.Pulse
方法。
如果我使用C#的监控,在我看来,该线程C可才醒悟b了
为什么?它的线程C调用Monitor.Pulse(a)
,那么它将唤醒线程A,就像在Java中使用a.pulse()
一样。
虽然有一些细微的差别,在Monitor.Wait
.NET/Pulse
/PulseAll
非常类似于Java Object.wait
/notify
/notifyAll
。我强烈怀疑,你现在想的不是这种情况,但没有具体的代码很难说。
你是对的,我没有注意到方法给了一个对象作为参数等待。 –
@OfekRon:值得注意的是,如果你试图想出一个完整的问题示例,你会很快遇到过这样的问题:) –
我不确定我是否正确理解了你,但我没有看到任何问题。下面的代码被有意简化,没有为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#中工作。
@Ben Care解释一下? – Fengari
通常你会从代码开始...... –
当它的抽象,至少在我看来,这个问题是更可读的方式 –
什么是等效的Java代码? – SLaks