std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?

Do std::promise::set_value() and std::future::wait() provide a memory fence?

本文关键字:std 内存 是否 romise set future value wait      更新时间:2023-10-16

如果我执行以下操作:

std::promise<void> p;
int a = 1;
std::thread t([&] {
a = 2;
p.set_value();
});
p.get_future().wait();
// Is the value of `a` guaranteed to be 2 here?

cppReference对set_value()有这样的说法,但我不确定它是什么意思:

对此函数的调用不会引入对get_future调用的数据争用(但它们不需要彼此同步(。

set_value()wait()是否提供获取/发布同步(或其他形式(?

从我的阅读来看,我相信a最后保证是 2。请注意有关承诺本身的信息(强调我的(:

promise

是 promise-future 通信通道的"推送"端:在共享状态下存储值的操作与(如 std::memory_order 中定义(从等待共享状态的任何函数(例如 std::future::get(的成功返回同步。对同一共享状态的并发访问可能会发生冲突,否则:例如,std::shared_future::get 的多个调用方必须全部为只读或提供外部同步。

当然,我鼓励你阅读某些东西同步的含义。对于这种情况,这意味着set_value被视为线程间发生之前,因此从我所写的内容来看a这是一个可见的副作用。您可以在此处找到更多信息。

你对get_future的问话是什么意思?这意味着您可以安全地从不同的线程调用get_futureset_value,并且不会破坏任何东西。但它本身也不一定引入任何内存围栏。唯一确定和安全的同步点是从std::promiseset_value,从std::futureget