在线程中读取无符号整数时,c++ 位是否以原子方式切换?
Are c++ bits switched atomically when reading unsigned ints across a thread?
在Mac,PC和Unix上的C++: 如果我在一个线程(写入线程(上写入无符号的 ints 或 Ipp32us 并从另一个线程(读取线程(读取无符号的整数,即使写入线程正在写入,读取线程也会读取没有故障。 我想知道这些位是否以原子方式切换。 谢谢
按照标准,对于非原子类型,没有保证。在实践中,它通常取决于底层硬件和相关数据类型的对齐方式;例如,如果 64 位写入作为一对 32 位写入在硬件上实现,则可以看到撕裂的值(旧值的一半,新值的一半(。如果硬件将它们实现为真正的 64 位写入,您可能是安全的,但这不是可以指望的。
请记住,"写入"可能会在多个阶段被撕裂,例如,编译器实际上可能会为每一半生成单独的内存移动指令(因此即使在单个内核上,也可以在写入的一半之间调度另一个线程(,或者它可能将其写入为单个指令,但处理器在内部将其实现为一对写入(按任一顺序, 甚至大会也没有告诉你顺序;像x86这样的架构似乎执行CISC指令,但实际上将它们转换为完全不同的内部RISC指令集(,或者处理器可能将其实现为单个写入,但如果存储跨越缓存行并且系统内存排序较弱,当其他处理器请求它时,它很容易只刷新其中一行(不可预测(, 等。
关键是,如果你想要原子写入和读取,实际上使用C++11std::atomic
类型。没有它,即使它可以工作,那也只是意味着它可以在编译器上工作,使用该硬件,并且对可移植性一无所知。
相关文章:
- 不同/较旧的处理器运行c++代码的方式是否不同
- 并发/多线程:是否可以以这种方式生成相同的输出?
- 这种方式是否可以接受向向量添加unique_ptr?
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- 在 Eclipse 中添加库的工作方式是否与在 Visual Studio 中相同?
- VS2017 是否更改了 C++ 中访问 C# 命名空间的方式?
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 我们是否应该转向新的自我分配保护方式?
- 以这种方式初始化的 char 数组是否会自动添加空终止符?
- clang++ 是否以更轻松的方式处理系统标头?
- size_t的大小和对齐方式是否与ptrdiff_t相同?
- 是否可以以编程方式构造 std::initializer_list?
- 是否有任何优雅的方式来遍历元素位置可以更改的列表?
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 是否可以在C++中以间接方式包含头文件
- C++:这两种将数字写入矩阵的方式之间是否存在显着的速度差异?
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- 我是否以错误的方式声明了getpriorityvalues函数
- 是否有用于"go to variable type definition" C++中"auto"变量的 Visual Studio 键盘快捷方式?