我一直在阅读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
仍然是原子的吗?
有人可以解释一下吗?