最近学习了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/