pos*_*ire 4 c++ multithreading mutex atomic
假设我有很多线程和一个简单的、可简单复制的非数组(基本类型float,如uint16_t等)变量,称为flag。其中只有一个线程经常设置变量的值,而其他线程只从中读取值而不写入它。在这种情况下,我是否必须使变量原子化或通过互斥体保护它?我知道当多个线程写入变量时我必须保护该变量,但在我的情况下有必要这样做吗?它依赖于平台吗?
编译器可以自由地对此进行优化:
while (x != 0) {
// code it knows does not modify x, nor synchronize with other threads
}
Run Code Online (Sandbox Code Playgroud)
进入
if (x!=0) {
while (true) {
// code it knows does not modify x
}
}
Run Code Online (Sandbox Code Playgroud)
即,检查x一次并逻辑上假设它无法更改。
然而,如果x是原子的,则不允许它们执行此操作,因为每次读取都会隐式同步发生在其他线程写入变量之后。
一般来说,在当前的 C++ 内存模型下,在线程 1 中读取变量而不同步在线程 2 中写入同一变量是 UB。
这个 UB 既可能是硬件问题,也可能是编译器以您可能认为有敌意的方式优化代码的权限。
所以是的,您需要告诉编译器您的读/写可能会涉及线程间通信。
有趣的是,您的代码今天可能可以在使用当前编译器的硬件上运行。然后几年后,无害的操作系统更新、编译器更新或硬件修订将使您的代码失败。更何况,这种失败的案例可能很少见,甚至可能就发生在今天!
你无法证明你的代码是正确的,因为我可以证明你的代码是错误的。您无法证明编译器(假设它没有错误)将永远生成执行您要求的操作的有效程序集,因为标准表明您的代码表现出 UB。
您也许能够获取编译器特定运行的汇编程序输出,并在 CPU 制造商为这些指令提供的保证下证明生成的代码是正确的。但我看过 CPU 指令描述,祝你好运。