Афиша специально просит о реализации без блокировки.
еализациизаблокировать бесплатный код для многопоточного приложения я использовал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;
}
}