【发布时间】:2011-01-29 08:00:40
【问题描述】:
我一直在阅读similar question 的答案,但我仍然有点困惑...... Abel 的答案很好,但这是我不确定的部分:
...声明一个变量 volatile 使得它对每一个变量都是 volatile 使用权。无法强制执行此操作 以任何其他方式行为,因此易变 不能用互锁代替。 这在以下场景中是必需的 其他库、接口或 硬件可以访问您的变量和 随时更新,或者最需要 最新版本。
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();
}
}
【问题讨论】:
-
很抱歉进行了多次编辑... Remus 一直是一项很好的运动。感谢您的信息! :)
标签: c# multithreading thread-safety volatile interlocked