在线程中读取无符号整数时,c++ 位是否以原子方式切换?

Are c++ bits switched atomically when reading unsigned ints across a thread?

本文关键字:是否 方式切 c++ 线程 读取 无符号整数      更新时间:2023-10-16

在Mac,PC和Unix上的C++: 如果我在一个线程(写入线程(上写入无符号的 ints 或 Ipp32us 并从另一个线程(读取线程(读取无符号的整数,即使写入线程正在写入,读取线程也会读取没有故障。 我想知道这些位是否以原子方式切换。 谢谢

按照标准,对于非原子类型,没有保证。在实践中,它通常取决于底层硬件和相关数据类型的对齐方式;例如,如果 64 位写入作为一对 32 位写入在硬件上实现,则可以看到撕裂的值(旧值的一半,新值的一半(。如果硬件将它们实现为真正的 64 位写入,您可能是安全的,但这不是可以指望的。

请记住,"写入"可能会在多个阶段被撕裂,例如,编译器实际上可能会为每一半生成单独的内存移动指令(因此即使在单个内核上,也可以在写入的一半之间调度另一个线程(,或者它可能将其写入为单个指令,但处理器在内部将其实现为一对写入(按任一顺序, 甚至大会也没有告诉你顺序;像x86这样的架构似乎执行CISC指令,但实际上将它们转换为完全不同的内部RISC指令集(,或者处理器可能将其实现为单个写入,但如果存储跨越缓存行并且系统内存排序较弱,当其他处理器请求它时,它很容易只刷新其中一行(不可预测(, 等。

关键是,如果你想要原子写入和读取,实际上使用C++11std::atomic类型。没有它,即使它可以工作,那也只是意味着它可以在编译器上工作,使用该硬件,并且对可移植性一无所知。

相关文章: