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

时间:2011-01-20 10:47:22

标签: c++ c multithreading atomic

我对多线程很感兴趣。该领域有很多陷阱,例如,无法保证指针写入是原子的。我明白这一点,但想知道实际情况下最流行的当前配置是什么?例如,在我的Macbook Pro / gcc上,指针写入肯定是原子的。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

请参阅here

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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