Является ли одновременное не-Atomi c чтение / запись неопределенным поведением? - PullRequest
0 голосов
/ 08 января 2020

Является ли одновременное чтение не-атоми c чтением и записью переменных фундаментальных типов C ++ (многократное чтение и многократная запись) неопределенным поведением в C ++? Меня не волнует фактическое значение, так как позже я узнаю, произошло ли одновременное чтение / запись, и если да, я игнорирую текущее значение. Я просто хочу знать, хорошо ли определено поведение C ++?

Если оно четко определено, все еще ли оно хорошо определено, если поток 1 читает / пишет x, а поток 2 читает / пишет y в, где x и y являются членами следующих union?

union {
  int x;
  double y;
};

Ответы [ 2 ]

9 голосов
/ 08 января 2020

Является ли одновременное чтение без записи c переменными основных типов C ++ (многократное чтение и многократная запись) неопределенным поведением в C ++?

Да. Стандарт (цитата из последнего проекта) гласит:

[intro.races]

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


просто хочу знать, хорошо ли определено поведение C ++?

Не определено.

если Поток 1 читает / записывает x, а Поток 2 читает / записывает y, где x и y являются членами следующего объединения?

Это потенциально даже «больше» не определено, потому что не существует только гонка данных, но также существует вероятность того, что значение неактивного члена объединения будет считано.

0 голосов
/ 12 января 2020

Хотя стандарт не может определить большинство вещей, касающихся многопоточности (даже то, что является последовательным, а что не определено), но ясно одно: вы не должны записывать в любую переменную, которую вы используете каким-либо образом "на в то же время ": вы должны использовать примитив взаимного исключения для внесения изменений в хорошо упорядоченные переменные.

...