Прежде чем я начну, я просто хочу подтвердить, что я знаю, что есть вопросы по этому поводу, которые я связал ниже:
Зачем мне нужен барьер памяти?
Зачем нам нужен Thread.MemoryBarrier ()?
Тем не менее ... Я прочитал оба и до сих пор не совсем понимаю, что происходит на базовом уровне.
class Foo
{
int _answer;
bool _complete;
void A()
{
_answer = 123;
Thread.MemoryBarrier(); // Barrier 1
_complete = true;
Thread.MemoryBarrier(); // Barrier 2
}
void B()
{
Thread.MemoryBarrier(); // Barrier 3
if (_complete)
{
Thread.MemoryBarrier(); // Barrier 4
Console.WriteLine (_answer);
}
}
}
Этот фрагмент кода взят из C # 4.0 в двух словах. В настоящее время я понимаю, что проблема без барьеров памяти заключается в том, что существует вероятность того, что B запустится до того, как A и B ничего не напечатают, потому что _complete
можно оценить как false
.
«Барьеры» в каждой функции полностью отделены друг от друга, и это не похоже на то, чтобы барьеры упорядочены ... Thread.MemoryBarrier(1)
или что-то в этом роде, поэтому компилятор не знает, что A должно стоять перед B < / сильный>.
Может ли кто-нибудь прояснить это для меня? Спасибо
РЕДАКТИРОВАТЬ: Я не понимаю, как работает порядок инструкций ... но я настолько сбит с толку в этой теме, что даже не знаю, как правильно сформулировать свой вопрос.
_answer = 123;
рядом с_complete = true;
и наоборот, а второй барьер освобождает линию денежных средств ЦП и гарантирует, что_answer
и_complete
свежие. 17.01.2016