我在MSDN上读了一篇关于无锁编程的文章Lockless Programming。它说:
在所有现代处理器上,您可以假定自然对齐的本地类型的读写是原子的。只要内存总线至少与被读取或写入的类型一样宽,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
变量的赋值仍然是原子操作吗?
请问有人可以解释一下吗?