Гарантирует ли 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();
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос