私はMSDNのロックレスプログラミングに関する記事を読んでいます。それは言う:
最近のすべてのプロセッサでは、自然に整列されたネイティブタイプの読み取りと書き込みはアトミックであると想定できます 。メモリバスが少なくとも読み取りまたは書き込み中のタイプと同じ幅である限り、CPUはこれらのタイプを単一のバストランザクションで読み取りおよび書き込みし、他のスレッドがそれらを半分完了した状態で見ることを不可能にします。
そしてそれはいくつかの例を与えます:
// 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
変数は引き続きアトミックですか?
誰か説明してもらえますか?