Барьер памяти в один поток

У меня есть этот вопрос, связанный с барьерами памяти.

В многопоточных приложениях барьер памяти должен использоваться, если между ними используются данные, поскольку запись в потоке, работающем на одном ядре, может не просматриваться другим потоком на другом ядре.

Из того, что я прочитал из других объяснений барьеров памяти, было сказано, что если у вас есть один поток, работающий с некоторыми данными, вам не нужен барьер памяти.

И вот мой вопрос: это может быть случай, когда поток изменяет некоторые данные на определенном ядре, а затем через некоторое время планировщик решает перенести этот поток на другое ядро.

Возможно ли, что этот поток не увидит свои модификации, сделанные на другом ядре?

2 ответа

Решение

В принципе: да, если выполнение программы перемещается с одного ядра на другое, оно может не увидеть все записи, которые произошли на предыдущем ядре.

Имейте в виду, что процессы сами не меняют ядра. Это операционная система, которая прерывает выполнение и перемещает поток в новое ядро. Таким образом, операционная система также несет ответственность за правильную синхронизацию операций с памятью при переключении контекста.

Для вас, как для программиста, это означает, что, пока вы не пытаетесь работать на уровне, где нет ОС с поддержкой SMP (например, когда вы пытаетесь написать свою собственную ОС или когда работаете на встроенной платформе без полноценная ОС), вам не нужно беспокоиться о проблемах синхронизации для этого случая.

ОС отвечает за когерентность или видимость памяти в дополнение к упорядочению памяти после миграции потоков. ака, ниже тест всегда проходит:

      int a = A
/* migration here */
assert(a == A)
Другие вопросы по тегам