多个线程可以安全地同时将相同的值写入同一个变量吗?
举一个具体的例子——C++ 标准是否保证以下代码在每个符合标准的系统上都可以编译、运行而没有未定义的行为并打印“true”?
#include <cstdio>
#include <thread>
int main()
{
bool x = false;
std::thread one{[&]{ x = true; }};
std::thread two{[&]{ x = true; }};
one.join();
two.join();
std::printf(x ? "true" : "false");
}
这是一个理论问题;我想知道它是否总是有效,而不是在实践中是否有效(或者像这样编写代码是否是一个好主意:))。如果有人能指出标准的相关部分,我将不胜感激。以我的经验,它在实践中总是有效的,但不知道它是否能保证我总是使用它std::atomic
——我想知道这对于这种特定情况是否是绝对必要的。