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++,您提出的问题根本无法回答。