假设我有两个线程,它们从全局范围内的静态 int 变量随机递增或递减。我的程序不关心这个变量的确切值,只关心它是随时间增加还是减少。
虽然在大学期间写过一些汇编代码,但对CPU如何处理多线程以及内核之间的通信并不熟悉。两个同时写入是否有可能在每字节级别上破坏全局变量?还是对内存的读写(例如移动、加载、存储)始终是原子的?
我使用 Visual Studio 2022 和 C++17,并希望以所有现代桌面 CPU(英特尔、AMD)为目标。
最佳答案
CPU 是最少的问题。 C++ 声明这些交互中的任何一个都代表未定义的行为。因此,请考虑以下代码:
int i; //Global variable.
void some_func()
{
i = 5;
if(i > 5)
{
//A
}
}
编译器可以看到分配给 i
和检查其值之间的所有代码。可以看出这两个操作之间没有线程间同步。因为 C++ 标准规定在这些情况下从另一个线程对 i
的任何修改都会产生未定义的行为,所以编译器可以自由地假设这样的修改不会发生。
因此,编译器知道 i
此时永远不会大于 5,因此可能会删除 block “A”和条件测试,甚至不会发出 可以执行的程序集.
这就是“未定义行为”的意思。
如果您想玩弄类似的东西,如果您想在这种情况下实际使用您的 CPU/缓存/等的行为,您将需要使用较低级别的语言进行操作。就其值(value)而言,C 标准具有或多或少相同的措辞,所以 C 不是。
只要您使用的是 C 或 C++,您提出的问题根本无法回答。
关于C++:线程竞争条件是否会破坏每字节级别的静态/全局整数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71932819/