Есть ли гарантия того, что присвоение переменной указателя является атомарной?
struct S {char a; int* p;};
S * p1 = new S;
S * p2 = new S;
p1 = p2;
Нет, поэтому C++ имеет атомные типы.
В С++ 03 таких гарантий нет, потому что язык не знает о потоках. Однако при назначении указателя Win32 гарантировано быть атомарным.
Простые чтения и записи для правильно выровненных 32-битных переменных являются атомарными операциями. Другими словами, вы не получите только одну часть обновленной переменной; все биты обновляются в атомном режиме. Однако синхронизация не гарантируется. Если два потока считывают и записывают из одной и той же переменной, вы не можете определить, будет ли один поток выполнять свою операцию чтения до того, как другой выполнит операцию записи.
Простые чтения и записи для правильно выровненных 64-битных переменных являются атомарными в 64-битной Windows. Чтение и запись в 64-битные значения не гарантируют атомарность в 32-разрядной Windows. Считывание и запись в переменные других размеров не гарантируется атомарным на любой платформе.
В С++ 11 тоже нет таких гарантий, если не используется std :: atomic.