Барьер памяти в один поток
У меня есть этот вопрос, связанный с барьерами памяти.
В многопоточных приложениях барьер памяти должен использоваться, если между ними используются данные, поскольку запись в потоке, работающем на одном ядре, может не просматриваться другим потоком на другом ядре.
Из того, что я прочитал из других объяснений барьеров памяти, было сказано, что если у вас есть один поток, работающий с некоторыми данными, вам не нужен барьер памяти.
И вот мой вопрос: это может быть случай, когда поток изменяет некоторые данные на определенном ядре, а затем через некоторое время планировщик решает перенести этот поток на другое ядро.
Возможно ли, что этот поток не увидит свои модификации, сделанные на другом ядре?
2 ответа
В принципе: да, если выполнение программы перемещается с одного ядра на другое, оно может не увидеть все записи, которые произошли на предыдущем ядре.
Имейте в виду, что процессы сами не меняют ядра. Это операционная система, которая прерывает выполнение и перемещает поток в новое ядро. Таким образом, операционная система также несет ответственность за правильную синхронизацию операций с памятью при переключении контекста.
Для вас, как для программиста, это означает, что, пока вы не пытаетесь работать на уровне, где нет ОС с поддержкой SMP (например, когда вы пытаетесь написать свою собственную ОС или когда работаете на встроенной платформе без полноценная ОС), вам не нужно беспокоиться о проблемах синхронизации для этого случая.
ОС отвечает за когерентность или видимость памяти в дополнение к упорядочению памяти после миграции потоков. ака, ниже тест всегда проходит:
int a = A
/* migration here */
assert(a == A)