Чтобы реализовать блокировки свободного кода для многопоточного приложения я использовал volatile
переменные, Теоретически: volatile
ключевое слово просто используется, чтобы убедиться, что все потоки увидеть самую последнюю величину а изменчивая переменная; поэтому, если поток A
обновляет значение переменной и поток B
читает эту переменную сразу после этого обновления, он увидит самое обновленное значение, которое недавно было написано из потока A. Как я читал в C# 4.0 в двух словах книга, которая это неправильно потомуЛетучие и Thread.MemoryBarrier в C#
применения летучий не препятствует записи, за которым следует читать из быть обменены.
Может эта проблема решается путем ввода 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;
}
}
Возможный дубликат ... http: //stackoverflow.com/questions/1330590/when-to-use-volatile-or-thread-memorybarrier-in-threadsafe-locking-code-c –
@Aron; нет, он не дублируется; это еще один вопрос. –
@Jalal Вы пытаетесь решить проблему, используя этот подход volatile/memorybarrier, или вы в порядке с любым подходом, который решает вашу проблему? –