Афиша специально просит о реализации без блокировки.

еализациизаблокировать бесплатный код для многопоточного приложения я использовалvolatile переменные,Теоретически:volatile ключевое слово просто используется, чтобы убедиться, что все потоки видят самое обновленное значение изменчивой переменной; так что если нитьA обновляет значение переменной и потокB прочитайте эту переменную сразу после того, как произойдет это обновление, она увидит самое последнее значение, записанное недавно из потока А. Как я читал вC # 4.0 в двух словах книга, что этонекорректный так как

применение volatile не препятствует замене записи, за которой следует чтение.

Можно ли решить эту проблему, поставивThread.MemoryBarrier() перед каждымvolatile переменная, как:

private volatile bool _foo = false;

private void A()
{
    //…
    Thread.MemoryBarrier();
    if (_foo)
    {
        //do somthing
    }
}

private void B()
{
    //…
    _foo = true;
    //…
}

И если это решит проблему; предположим, что у нас есть цикл while, который зависит от этого значения в одном из его условий; ставитThread.MemoryBarrier() перед циклом while это правильный способ исправить проблему? пример:

private void A()
{
    Thread.MemoryBarrier();
    while (_someOtherConditions && _foo)
    {
        // do somthing.
    }
}

Чтобы быть более точным, я хочу_foo переменная, чтобы дать самое свежее значение, когда любой поток запрашивает его в любое время; так что если вставитьThread.MemoryBarrier() перед вызовом переменной решает проблему, тогда я мог бы использоватьFoo собственность вместо_foo и сделатьThread.MemoryBarrier() в пределах этого свойства

Foo
{
    get 
    {
        Thread.MemoryBarrier();
        return _foo;
    }
    set
    {
        _foo = value;
    }
}

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

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