据说thread::join()
与完成相应的执行线程同步。我想知道这同样适用于async()
和future::wait()
。例如:
std::atomic_int v(0);
std::async(
std::launch::async,
[&v] { v.fetch_add(1, std::memory_order_relaxed); }
).wait();
assert(v.load(std::memory_order_relaxed) == 1);
assert()
永远不会失败。
答案 0 :(得分:4)
直接来自N3337(c++11标准草案),[futures.async]/5我强调:
同步:无论提供的策略参数如何,
异步调用与([intro.multithread])f的调用同步。 [注意:此声明适用于即使 相应的未来对象被移动到另一个线程。 - 结束说明]; 以及
功能f的完成在之前排序([intro.multithread])共享状态准备就绪。 [注意:f可能 根本不被召唤,所以它的完成可能永远不会发生。 - 结束 注意]
如果实施选择
launch::async
政策,
对共享此异步调用创建的共享状态的异步返回对象的等待函数的调用将阻塞,直到 关联的线程已经完成,就像加入一样 ([thread.thread.member]);
关联的线程完成与([intro.multithread])从第一个函数的返回同步 成功检测共享状态的就绪状态或与 从最后一个释放共享状态的函数返回, 以先发生者为准。
所以提到你的问题,这意味着是的,断言永远不会失败。