C++:线程竞争条件能否在每字节级别上破坏 static/global 整数值?
C++: Can thread race conditions corrupt static/global integer values on a per-byte level?
假设我有两个线程,它们从全局范围内的静态 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
和检查其值之间的所有代码。可以看出这两个操作之间没有inter-thread同步。因为 C++ 标准声明在这些情况下从另一个线程对 i
的任何修改是未定义的行为,编译器可以自由地假设这样的修改 不会发生 .
因此,编译器知道 i
此时永远不会大于 5,因此可能会删除块“A”和条件测试,甚至不会发出 可能是已执行.
就是“未定义行为”的意思。
如果你想玩弄那样的东西,如果你想在这种情况下实际使用你的 CPU/cache/etc 的行为,你将需要在 lower-level 中操作语。对于它的价值,C 标准有 more-or-less 相同的措辞,所以 C 不是它。
只要您使用的是 C 或 C++,您提出的问题根本无法回答。
假设我有两个线程,它们从全局范围内的静态 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
和检查其值之间的所有代码。可以看出这两个操作之间没有inter-thread同步。因为 C++ 标准声明在这些情况下从另一个线程对 i
的任何修改是未定义的行为,编译器可以自由地假设这样的修改 不会发生 .
因此,编译器知道 i
此时永远不会大于 5,因此可能会删除块“A”和条件测试,甚至不会发出 可能是已执行.
就是“未定义行为”的意思。
如果你想玩弄那样的东西,如果你想在这种情况下实际使用你的 CPU/cache/etc 的行为,你将需要在 lower-level 中操作语。对于它的价值,C 标准有 more-or-less 相同的措辞,所以 C 不是它。
只要您使用的是 C 或 C++,您提出的问题根本无法回答。