c ++中的并发问题11

时间:2014-11-20 12:57:38

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

使用std::atomic<int>代替int