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;
}
}