什么是C++11内存模型,它如何影响多线程编程?
大家好。我正在学习C++,学到了多线程部分。我读到C++11中引入了一个“内存模型”,它改变了一切。但我不明白这到底是什么意思,以及为什么需要它。
以前我写过类似这样的代码:
```cpp
#include
#include
#include
int shared_data = 0;
bool ready = false;
void writer() {
shared_data = 42; // 步骤1
ready = true; // 步骤2
}
void reader() {
while (!ready); // 等待ready变为true
std::cout << shared_data << std::endl; // 这里总是42吗?
}
```
我在自己的电脑上运行过,它工作正常。但有人告诉我,如果没有内存模型和带有正确barrier的atomic操作,这段代码可能在另一个CPU上或编译器优化时出问题。为什么?我明明在`ready`之前设置了`shared_data`!难道编译器或CPU可以重排这些操作吗?如果可以,C++11内存模型如何防止这种情况?请解释。