这种使用std::promise的方式是否线程安全?

4

考虑以下代码:

#include <thread>
#include <iostream>
#include <future>

std::promise<int> prom;

void thr_func(int n)
{
    prom.set_value(n + 10);
}

int main()
{
    std::thread t{thr_func, 5};

    auto fut = prom.get_future();

    int result = fut.get();
    std::cout << result << std::endl;

    t.join();
}

prom对象被并发访问,尽管标准规定set_value是原子的,但我找不到任何关于get_future是否是原子的(或者const的)。

因此,我想知道这种方式调用get_future是否正确。


你在这段代码中没有从多个线程调用get_future,所以我不确定你的问题是什么。 - xaxxon
如果您在同一个 Promise 上多次调用 set_value,这是否会导致 promise_already_satisfiedstd::future_error - dfrib
@xaxxon mainthr_func 在不同的线程中运行。 - LWimsey
1个回答

6

你说得对,该标准并没有指明get_future是原子的。可能在调用set_value时并发调用它是不安全的。

相反,在创建线程之前调用get_future。这可以确保在调用set_value之前调用它。

auto fut = prom.get_future();

std::thread t{thr_func, 5};

...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接