Volatile and Thread.MemoryBarrier in C#

To implement a lock free code for multithreading application I used volatile variables, Theoretically: The volatile keyword is simply used to make sure that all threads see the most updated value of a volatile variable; so if thread A updates the variable value and thread B read that variable just after that update is happened it will see the most updated value that written recently from thread A. As I read in a C# 4.0 in a Nutshell book that это неверно , потому что

применение 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;
    }
}
9
задан CRABOLO 21 March 2015 в 19:23
поделиться