打包的任务参数是否存在数据竞赛?

时间:2018-12-10 19:15:40

标签: c++ multithreading c++11 future packaged-task

通过打包任务创建线程,并返回std::vector

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

std::vector<int> func(int &arg)
{
    std::vector<int> v = {1,2,3,4};

    arg = 10;

    return v;
}

int main()
{
    std::packaged_task<std::vector<int>(int &)> pt{func};
    auto fut = pt.get_future();

    int arg = 0;
    std::thread thr{std::move(pt), std::ref(arg)};

    auto vec = fut.get();

    std::cout << arg << std::endl;  // data race here ?

    thr.join();
}

std::future保证向量与main线程(在join之前)同步, 但是我不确定打包的任务参数(通过引用传递)的状态。

所以问题是arg上是否存在数据竞赛?

1 个答案:

答案 0 :(得分:3)

int arg=0;

先于 我们启动线程thr,因为它是先于

arg = 10;

由于vec的调用,此先发生 .get()已初始化:

auto vec=fut.get();

之前

std::cout << arg << std::endl;

所以我在这里没有数据争夺战。

cpp reference虽不具权威性,但声称:

  

promise是promise-future通信通道的“推”端:在共享状态下存储值的操作与(正在std :: memory_order中定义的)同步-从正在等待的任何函数成功返回在共享状态(例如std :: future :: get)上。

std::async也有相似的词。我相信packaged_task也有类似的保证;它打算用作原始来帮助实现毕竟自己的std::async类似行为。