Гарантирует ли Interlocked видимость другим потокам в C # или мне все еще нужно использовать 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();
}
}