Упрощенный вопрос:
Есть ли разница в синхронизации когерентности кэширования памяти (или "промывки" ), вызванной блокировкой операций по сравнению с барьерами памяти? Рассмотрим в С# - любые операции с блокировкой vs Thread.MemoryBarrier(). Я считаю, что есть разница.
Фон:
Я прочитал довольно мало информации о барьерах памяти - все это повлияло на предотвращение переупорядочения инструкций определенных типов памяти, но я не смог найти постоянную информацию о том, должны ли они немедленно вызывать очередность чтения/записи.
На самом деле я нашел несколько источников, в которых упоминается, что нет гарантии на непосредственность операции (гарантируется только предотвращение специфического переупорядочения). Например.
Wikipedia: "Однако, чтобы быть ясным, это не означает, что какие-либо операции будут завершены к моменту завершения барьера, гарантируется только ЗАВЕРШЕНИЕ завершения операций (когда они завершатся)"
Freebsd.org (барьеры специфичны для HW, поэтому я думаю, что конкретная ОС не имеет значения): "Балансы памяти просто определяют относительные порядок операций с памятью, они не гарантируют синхронизацию операций с памятью"
С другой стороны, блокированные операции - из их определения - приводят к немедленной очистке всех буферов памяти, чтобы гарантировать обновление последнего значения переменной. заставляет подсистему памяти блокировать всю строку кэша со значением, чтобы предотвратить доступ (включая чтение) из любого другого ЦП/ядра, пока операция не будет выполнена.
Правильно ли я ошибаюсь?
Отказ от ответственности:
Это эволюция моего первоначального вопроса здесь Возможность переменной свежести в .NET(volatile vs. volatile read)
EDIT1: Исправлено мое утверждение о блокированных операциях - встраивание текста.
EDIT2: Полностью удалить демонстрационный код + это обсуждение (поскольку некоторые жаловались на слишком много информации)