Для реализации кода без блокировки для многопоточного приложения я использовал 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()
в пределах get этого свойства.
Foo
{
get
{
Thread.MemoryBarrier();
return _foo;
}
set
{
_foo = value;
}
}