C++:线程竞争条件是否会破坏每字节级别的静态/全局整数值?

标签 c++ multithreading c++17 race-condition data-corruption

假设我有两个线程,它们从全局范围内的静态 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/

相关文章:

c++ - 转换标准 :set<int> into jintArray

c++ - 如何将指针作为数组参数传递?

java - 从不同线程中的消息循环返回操作结果

java - 如何在 Java 8 中执行这个并行任务

mysql - 使用多线程缓慢的mysql数据库恢复(delphi)

c++ - 从从左到右读取的所有类型创建嵌套包

c++通过构造函数选择推断bool类模板参数

c++ - STL 列表迭代器错误

c++ - 如何将 Iplimage 放在图片框上?

c++ - gcc not_fn 实现 : why does _Not_fn accept additional int parameter?