Атомарность в C ++: миф или реальность

Я читал статью о Lockless Programming в 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;

Я читал множество ответов и комментариев, в которых говорится, что ничто не может быть атомарным в C ++, и это даже не упоминается в стандартах, в SO, и теперь я немного запутался. Я неверно истолковал статью? Или автор статьи говорит о вещах, которые не являются стандартными и специфичными для компилятора MSVC ++?

Итак, согласно статье, указанные ниже назначения должны быть атомарными, не так ли?

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 по-прежнему атомарными?

Кто-нибудь, пожалуйста, объясните?

33
задан ali_bahoo 15 February 2011 в 10:34
поделиться