Проблемы совпадения в C++11
Недавно я узнал о многопоточности библиотеки в C++11. Я рассматриваю такую ситуацию, что существует глобальная переменная int x=0 и два отдельных потока работают в двух разных ядрах. Могут ли два потока быть записаны в память x одновременно? Например, в потоке #1 пусть x=0x0000, в потоке #2 let x=0xffff. Может ли x быть некоторым недействительным значением 0x00ff?
Я протестировал его на x86-64 linux(windows) с g++ clang msvc, ответ - нет, значение x - 0x0000 или 0xffff. Похоже, что операция присваивания является атомарной или это просто совпадение.
Может ли кто-нибудь помочь мне об этом?
1 ответ
Теоретически, говоря - вы можете в конечном итоге 0x00ff
, или даже 0xabcd
, Если два потока пытаются изменить значение объекта, и эти выражения не упорядочены (то есть синхронизированы), поведение программы не определено.
Теперь, может ли это произойти на практике - это действительно зависит от архитектуры ОС и оборудования, и, хотя вероятность мала, это все же может произойти.
использование std::atomic<int>
вместо int