Имеется ли прямой доступ к общим переменным потока? - PullRequest
1 голос
/ 08 мая 2020

Чтение о модели памяти C ++ и директивах упорядочивания вызвало у меня вопросы - в том же процессе, когда переменная atomi c, совместно используемая потоком (например, atomi c), устанавливается в одном потоке - и упорядочение load идет после store - возможно ли, что load не видит сохраненное значение?

Rephrased - это заказ гарантии, что установленное значение atomi c загружено как есть, или есть CPU / cache / et c абстракция, которая все еще может предоставлять более старое значение?

Причина вопросов - в некоторых литературах говорится о синхронизации (помимо упорядочивания) и о языке, который они используют, «как видно из другого потока» - что заставляет меня задаться вопросом, не является ли загрузка прямым доступом к ячейке памяти (для которой не требуется никакой другой синхронизации, кроме упорядочивания).

1 Ответ

0 голосов
/ 11 мая 2020

Я не уверен, правильно ли я понял ваш вопрос, но я могу попытаться предоставить некоторые подробности о модели памяти C ++.

Порядок памяти по умолчанию для всех операций на атомике C ++: последовательный согласованный . Формально это означает, что существует единый общий порядок ( S ) всех последовательно согласованных операций (независимо от того, каким потоком они выполняются). Итак, если поток A выполняет seq-cst-store для некоторой переменной X , а поток B выполняет seq-cst-load для X , и магазин упорядочивается перед загрузкой в ​​ S , тогда гарантируется, что B увидит значение, сохраненное A (или какое-то новое значение ).

Однако, как только вы используете более расслабленный порядок памяти для своих операций, вы теряете эту гарантию, потому что эти более расслабленные операции atomi c обычно неупорядоченные . Однако вы можете ввести порядок с помощью отношения происходит до между определенными операциями. Например, загрузка-получение, которая видит значение, записанное хранилищем выпуска , синхронизируется с этим хранилищем, тем самым устанавливая связь «произошло до».

Модель памяти C ++, безусловно, является одной из более сложные аспекты языка и не могут быть полностью объяснены простым ответом. Для получения дополнительной информации я рекомендую продолжить чтение, например, эту статью, в которой я являюсь соавтором: Модели памяти для программистов C / C ++
Он не только охватывает модель памяти C ++, но также дает краткий обзор модели памяти x86 и ARM / Power, пытаясь объяснить, почему вообще необходимо иметь модель памяти.

...