видимый побочный эффект< /strong> A на скалярном объекте или битовом поле M относительно вычисления значения B из M удовлетворяет условиям:
- A происходит до B и
- не существует другого побочного эффекта от X до M, такого, что A происходит раньше X и X происходят раньше B.
Значение неатомарный скалярный объект или битовое поле M, как определено оценкой B, должно быть значением, сохраненным видимым побочным эффектом A.
А также согласно стандарту C++ связь «происходит до» между потоками должна быть установлена с помощью «синхронизируется с» или «< em>упорядочивается по зависимостям до", поэтому связь "происходит до" не будет установлена без синхронизации между потоками.
Теперь предположим, что есть два потока T1 и T2, оба запускаются основным потоком и никогда не синхронизируются друг с другом (поэтому не будет никаких отношений «происходит раньше», установленных между T1 и T2). Если T1 записывает в неатомарную переменную M, то, согласно приведенной выше цитате, T2 никогда не должен видеть M, измененную T1, поскольку не существует связи «происходит раньше». между T1 и T2.
Вместо этого T2 имеет отношение «синхронизируется с», установленное с основным потоком во время запуска T2, поэтому T2 должен видеть значение M устанавливается основным потоком до того, как он был запущен основным потоком, поскольку между основным потоком и T2 существует связь «происходит раньше».
Верно ? Однако я провел эксперимент на своей машине, и это не так. Что не так?
Подробнее здесь: https://stackoverflow.com/questions/612 ... -variables