【发布时间】:2020-01-09 01:11:34
【问题描述】:
多个线程能否安全地将相同的值同时写入同一个变量?
举个具体的例子——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 代替 - 我想知道这对于这种特定情况是否是绝对必要的。
【问题讨论】:
-
std 无法定义 MT 程序。故事结束。
-
@curiousguy 你在说什么?它强烈而严格地做到了for almost a decade。
-
@LightnessRacesBY-SA3.0 错误。没有解释如何将非线程程序的语义扩展到 MT。所以不仅没有定义MT程序,也没有定义单线程程序。
-
再次评论警察。 @curiousguy 这毫无意义。
-
有点奇怪的例子:
bool变量只有两个可能的值。更有趣的情况是使用double变量,并让两个线程中的每一个都存储不同的值。然后你可以询问最终结果是否保证是两个线程存储的两个值之一,或者它是否可能是初始值,或者它是否可能完全是其他值。
标签: c++ multithreading thread-safety data-race