2012-07-04 102 views
0

在Java中,你可以等待每个对象,所以这种情况是可能的方案:在对象C#等待和脉冲

线程A等待的对象

线程B等待b

关于b A

线程A分配时通知线程C-分配时通知

如果我使用C#的监控,在我看来,该线程C可才醒悟b向上(或b和A),然后怎么办我是个可能有这种情况吗?

+1

通常你会从代码开始...... –

+0

当它的抽象,至少在我看来,这个问题是更可读的方式 –

+0

什么是等效的Java代码? – SLaks

回答

1

你似乎认为,因为C#同步功能是Monitor类的成员,你需要一个特殊的Monitor实例使用它们,而相比之下,Java的,他们是java.lang.Object类的成员,并适用于所有对象。

恰恰相反。根本没有Monitor实例。在C#中,这些函数是静态方法,并且仍然适用于任何对象。 Monitor类的唯一原因是为了防止System.Object与额外的成员混淆(这将显示在Intellisense建议列表中,等等)。

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

+0

是的,那正是我想的......谢谢! –

1

您正在查找的Monitor.WaitMonitor.Pulse方法。

3

如果我使用C#的监控,在我看来,该线程C可才醒悟b了

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

虽然有一些细微的差别,在Monitor.Wait .NET/Pulse/PulseAll非常类似于Java Object.wait/notify/notifyAll。我强烈怀疑,你现在想的不是这种情况,但没有具体的代码很难说。

+0

你是对的,我没有注意到方法给了一个对象作为参数等待。 –

+1

@OfekRon:值得注意的是,如果你试图想出一个完整的问题示例,你会很快遇到过这样的问题:) –

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#中工作。

+0

@Ben Care解释一下? – Fengari