linux - C++11中的并发问题

标签 linux multithreading c++11 linux-device-driver

最近学习了c++11中的多线程库。我考虑这样一种情况,有一个全局变量 int x=0 并且有两个单独的线程在两个单独的核心中运行。两个线程是否可以同时写入x的内存?例如,在 thread#1 let x=0x0000、int thread#2 let x=0xffff 中,x 可能是 0x00ff 的某个无效值吗?

我在x86-64 linux(windows)上用g++ clang msvc测试过,答案是否定的,x的值为0x0000或0xffff。看起来分配操作是原子的或者只是巧合。

有人可以帮我解决这个问题吗?

最佳答案

从理论上来说,你绝对可以得到 0x00ff ,甚至 0xabcd 。如果两个线程尝试修改对象的值,并且这些表达式没有排序(即同步),则程序的行为是未定义的。

现在,这在实践中是否会发生——这实际上取决于操作系统和硬件架构,虽然概率很低,但仍然有可能发生。

使用std::atomic<int>而不是int

关于linux - C++11中的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27040215/

相关文章:

linux - 如何在 Linux shell 中使用 if else 设置 var 值

android - Android SurfaceView onDraw暂停Thread.join()

c++ - 'auto' 关键字是否知道何时使用 const 迭代器?

c - 使用C代码获取环境变量

java - Linux 上 Android Studio 的 JDK 路径

c++ - 了解以下 cpp 片段

multithreading - 在 Spring 中停止线程

c++ - 有符号的十六进制文字可能吗?

c++ - 在 switch 语句中从 int 到 enum 类的隐式转换

linux - 如何使用输出分页 Heredoc 执行 SSH 命令