Я читал статью о Программе блокировки в MSDN. В нем говорится:
На всех современных процессорах вы можете предположите, что читает и пишет Естественно выровненные нативные типы являются атомарными. Пока шина памяти по меньшей мере такой же широкий, как тип читать или писать, процессор читает и записывает эти типы в одну шину транзакции, что делает невозможным другие темы, чтобы увидеть их в полузаполненное состояние.
И он дает несколько примеров:
// This write is not atomic because it is not natively aligned.
DWORD* pData = (DWORD*)(pChar + 1);
*pData = 0;
// This is not atomic because it is three separate operations.
++g_globalCounter;
// This write is atomic.
g_alignedGlobal = 0;
// This read is atomic.
DWORD local = g_alignedGlobal;
Я прочитал много ответов и комментариев, говорящих: ничто не гарантировано является атомарным в С++, и это даже не упоминается в стандартах, в SO, и теперь я немного смущен. Я неправильно истолковал статью? Или писатель статьи говорит о вещах, которые не являются стандартными и специфичными для компилятора MSVС++?
Итак, согласно статье, следующие назначения должны быть атомарными, правильно?
struct Data
{
char ID;
char pad1[3];
short Number;
char pad2[2];
char Name[5];
char pad3[3];
int Number2;
double Value;
} DataVal;
DataVal.ID = 0;
DataVal.Number = 1000;
DataVal.Number2 = 0xFFFFFF;
DataVal.Value = 1.2;
Если это правда, заменит ли Name[5]
и pad3[3]
на std::string Name;
какую-либо разницу в выравнивании памяти? Будут ли назначения переменных Number2
и Value
еще атомарными?
Может кто-нибудь объяснит?