这样使用std :: promise线程安全吗?

时间:2018-08-11 23:27:51

标签: c++ multithreading c++11 promise

考虑以下代码:

#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是否正确。

1 个答案:

答案 0 :(得分:5)

您是对的,该标准并未说明get_future是原子的。与set_value并发调用可能不安全。

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

auto fut = prom.get_future();

std::thread t{thr_func, 5};

...