Я действительно слышал заявления в обоих направлениях. Я подозреваю, что это не так, но я хотел, чтобы эта тема была решена.
Является ли назначение указателя атомом в C++?
Ответ 1
С++ 03 не знает о существовании потоков, поэтому понятие атомарности не имеет большого смысла для С++ 03, а это значит, что в нем ничего не говорится.
С++ 11 знает о потоках, но в очередной раз ничего не говорит об атомарности присвоения указателей. Однако С++ 11 содержит std::atomic<T*>
, который, как гарантируется, является атомарным.
Обратите внимание, что даже если запись на исходный указатель является атомарной на вашей платформе, компилятор по-прежнему может свободно перемещать эту настройку, так что вы действительно ничего не покупаете.
Если вам нужно написать указатель, который используется совместно между потоками, используйте либо std::atomic<T*>
(или еще не официальный boost::atomic<T*>
, атомарные свойства gccs или окна Interlocked *), либо завершите все обращения к этому указателю в мьютексах.
Ответ 2
Нормой C++ не определяется конкретное поведение потоков. В зависимости от компилятора и платформы назначение указателя может быть или не быть атомарным.