Является ли указатель атомарным в C ++? - PullRequest
12 голосов
/ 19 января 2012

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

Ответы [ 2 ]

16 голосов
/ 19 января 2012

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

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

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

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

2 голосов
/ 19 января 2012

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

...