В настоящее время я пытаюсь улучшить мое понимание барьеров памяти, блокировок и модели памяти.
Насколько я знаю, существует четыре различных типа расслаблений: namley Write -> Read, Write -> Write, Read-> Написать и прочитать -> Читать.Процессор x86 допускает просто расслабление Write-> Read, которое часто называют Total Store Order (TSO).Частичный порядок хранения (PSO) позволяет дополнительно ослаблять запись-> запись, а расслабленный порядок хранения (RSO) допускает все вышеперечисленные ослабления.
Кроме того, существуют три типа барьеров памяти: освобождение, получение и оба вместе.Блокировки могут использовать только барьеры получения и освобождения или иногда полные барьеры (.Net).
Теперь рассмотрим следующий пример:
// thread 0
x = 1
flag = 1
//thread 1
while (flag != 1);
print x
Мое текущее понимание говорит мне, что мне не нужна дополнительная памятьбарьеры, если я запускаю этот код на машине TSO.Если это PSO-машина, мне нужен барьер освобождения между x = 1 и flag = 1, чтобы поток 1 получил действительное значение x, если flag = 1.Если это RSO-машина, мне нужен дополнительный барьер для получения между while (flag! = 1);и выведите x, чтобы поток 1 не считал значение x на ранний срок.
Верны ли мои наблюдения?