Самый простой ответ: volatile
вообще не нужен для многопоточности.
Длинный ответ состоит в том, что точки последовательности, такие как критические секции, зависят от платформы, как и любое используемое вами решение для потоков, поэтому большая часть вашей безопасности потоков также зависит от платформы.
C ++ 0x имеет концепцию потоков и безопасности потоков, но текущий стандарт этого не делает, и поэтому volatile
иногда ошибочно идентифицируется как нечто, что предотвращает переупорядочение операций и доступ к памяти для многопоточного программирования, когда оно никогда не предназначалось и не может быть надежно использован таким образом.
Единственное, что volatile
следует использовать в C ++, это разрешить доступ к отображенным в память устройствам, разрешить использование переменных между setjmp
и longjmp
и разрешить использование sig_atomic_t
переменных в обработчиках сигналов. Само ключевое слово не делает переменную атомарной.
Хорошая новость в C ++ 0x - у нас будет конструкция STL std::atomic
, которую можно использовать для гарантии атомарных операций и поточно-безопасных конструкций для переменных. Пока ваш выбранный компилятор не поддержит его, вам, возможно, придется обратиться к библиотеке надстройки или запустить некоторый ассемблерный код, чтобы создать свои собственные объекты для предоставления атомарных переменных.
P.S. Большая путаница вызвана тем, что Java и .NET фактически применяют многопотоковую семантику с ключевым словом volatile
C ++, однако следует примеру C, где это не так.