我一直在阅读类似问题的答案,但我仍然有点困惑......亚伯有一个很好的答案,但这是我不确定的部分:
...声明一个变量 volatile 使其在每次访问时都是 volatile 的。不可能以任何其他方式强制这种行为,因此 volatile 不能用 Interlocked 代替。这在其他库、接口或硬件可以访问您的变量并随时更新它或需要最新版本的情况下是必需的。
是否Interlocked
保证原子操作对所有线程的可见性,还是我仍然必须volatile
在值上使用关键字以保证更改的可见性?
这是我的例子:
volatile int value = 100000; // <-- do I need the volitile keyword
// ....
public void AnotherThreadMethod()
{
while(Interlocked.Decrement(ref value)>0)
{
// do something
}
}
public void AThreadMethod()
{
while(value > 0)
{
// do something
}
}
更新:
我是一项糟糕的运动,我改变了原来的例子,所以又是这样:
public class CountDownLatch
{
private volatile int m_remain; // <--- do I need the volatile keyword here?
private EventWaitHandle m_event;
public CountDownLatch(int count)
{
Reset(count);
}
public void Reset(int count)
{
if (count < 0)
throw new ArgumentOutOfRangeException();
m_remain = count;
m_event = new ManualResetEvent(false);
if (m_remain == 0)
{
m_event.Set();
}
}
public void Signal()
{
// The last thread to signal also sets the event.
if (Interlocked.Decrement(ref m_remain) == 0)
m_event.Set();
}
public void Wait()
{
m_event.WaitOne();
}
}