C++ 指针写入不是原子的最常见的配置是什么?

C++ 指针写入不是原子的最常见的配置是什么?,c++,c,multithreading,atomic,C++,C,Multithreading,Atomic,我对多线程感兴趣。字段中有很多陷阱,例如,不能保证指针写入是原子的。我明白了,但想知道在实际情况下,当前最流行的配置是什么?例如,在我的Macbook Pro/gcc上,指针写入显然是原子性的。对于指针宽度大于CPU架构宽度的CPU架构来说,这主要是一个问题。例如,在8位体系结构的CPU上,地址空间为16位。如果没有任何特定的指令来加载和存储16位地址,则至少需要两条指令来加载/存储指针值。请参阅。正如Daniel所说,几乎每个体系结构都会受到影响。除非强制执行内存对齐,否则每次写入都可能导致多

我对多线程感兴趣。字段中有很多陷阱,例如,不能保证指针写入是原子的。我明白了,但想知道在实际情况下,当前最流行的配置是什么?例如,在我的Macbook Pro/gcc上,指针写入显然是原子性的。

对于指针宽度大于CPU架构宽度的CPU架构来说,这主要是一个问题。例如,在8位体系结构的CPU上,地址空间为16位。如果没有任何特定的指令来加载和存储16位地址,则至少需要两条指令来加载/存储指针值。

请参阅。

正如Daniel所说,几乎每个体系结构都会受到影响。除非强制执行内存对齐,否则每次写入都可能导致多个操作,但如果地址总线小于数据总线,则也会失败。因此,您很可能需要使用锁定机制编写代码。无论如何,这是一个好主意,因为您可能希望代码是可移植的。对于某些非常特殊的体系结构,这些锁定函数可能只是空的。

指针可能不是使用分段地址空间的平台上的原子类型,如MS-DOS或Win 3.x。但我不知道有任何现代桌面/服务器平台使用这种体系结构(至少在平台级别)


然而,即使从C编译器的角度来看,写操作是原子的,也可能会出现其他问题,即使是在现代桌面/服务器系统上,尤其是在处理多核/多处理器系统时(缓存、处理器在较低级别执行的内存访问重新排序)。”平台提供的原子API使用内存屏障(如果需要)处理这些问题,因此在尝试确保内存访问是原子访问时,您可能仍应使用这些API。

如果指针存储在未对齐的内存位置,也应如此(这样它的值就可以存储在两个不同的缓存线中?@jdv:这不太可能是偶然发生的。所以我对这种情况不感兴趣。即使它们是原子的,也会有可见性问题——除非注意,否则指针可能存储在寄存器中,而从未写入内存——或者内存写入可能会发生根据您的代码重新排序,并且在您认为会发生时不会发生。是的,我知道-现在对桌面/服务器体系结构更感兴趣,但这是一个很好的答案。您知道除了ATmega之外,有任何平台会出现这种情况吗?根据我的经验,“非常特殊的体系结构”会转化为“大多数体系结构”在这种情况下,最好是作为对问题的评论(或者建议以重复形式结束)