通过打包任务创建线程,并返回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
上是否存在数据竞赛?
答案 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
类似行为。