我一直在閱讀的答案,similar question,但我還是有點迷茫......亞伯有一個偉大的答案,但是這是我不確定的部分:Interlocked是否保證對C#中其他線程的可見性,還是仍然需要使用volatile?
.. .declaring一個變量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一直是一個很好的運動。感謝您的信息! :) – Kiril 2010-03-19 06:29:40