Является ли назначение указателя атомом в C++?

Я действительно слышал заявления в обоих направлениях. Я подозреваю, что это не так, но я хотел, чтобы эта тема была решена.

Ответ 1

С++ 03 не знает о существовании потоков, поэтому понятие атомарности не имеет большого смысла для С++ 03, а это значит, что в нем ничего не говорится.

С++ 11 знает о потоках, но в очередной раз ничего не говорит об атомарности присвоения указателей. Однако С++ 11 содержит std::atomic<T*>, который, как гарантируется, является атомарным.

Обратите внимание, что даже если запись на исходный указатель является атомарной на вашей платформе, компилятор по-прежнему может свободно перемещать эту настройку, так что вы действительно ничего не покупаете.

Если вам нужно написать указатель, который используется совместно между потоками, используйте либо std::atomic<T*> (или еще не официальный boost::atomic<T*>, атомарные свойства gccs или окна Interlocked *), либо завершите все обращения к этому указателю в мьютексах.

Ответ 2

Нормой C++ не определяется конкретное поведение потоков. В зависимости от компилятора и платформы назначение указателя может быть или не быть атомарным.