根据“c ++编程语言第4版”中有关 future 的内容
§5.3.5.1第120页:
如果该值尚未存在,我们的线程将被阻止,直到它到达。
意味着 get()是一种阻止方法。
后面的第5.3.5.2页第122页解释了 packaged_task ,并给出了以下代码示例:
double accum(double* beg, double* end, double init)
// compute the sum of [beg:end) starting with the initial value init
{
return accumulate(beg,end,init);
}
double comp2(vector<double>& v)
{
using Task_type = double(double*,double*,double); // type of task
packaged_task<Task_type> pt0 {accum}; // package the task (i.e., accum)
packaged_task<Task_type> pt1 {accum};
future<double> f0 {pt0.get_future()}; // get hold of pt0’s future
future<double> f1 {pt1.get_future()}; // get hold of pt1’s future
double* first = &v[0];
thread t1 {move(pt0),first,first+v.size()/2,0}; // start a thread for pt0
thread t2 {move(pt1),first+v.size()/2,first+v.size(),0}; // start a thread for pt1
// ...
return f0.get()+f1.get(); // get the results
}
这是有道理的,因为根据引用,即使没有调用 join(), comp2()函数中的2个线程完成后,以下程序也不会返回因为调用 comp2()的主题将等待将来,直到他们得到()他们的值:
int main()
{
vector<double> v {1.1, 8.3, 5.6};
double res = comp2(v);
return 0;
}
不幸的是,这并没有像我想象的那样发生,而是我少打电话给 join() 在 comp2()中的2个线程上,将抛出运行时错误。
有人可以解释一下我在这里缺少什么以及 get()为什么不阻止?
答案 0 :(得分:1)
我用gdb调试了你的代码,你的运行时错误发生在std :: thread析构函数中。在他们被破坏之前,您必须detach
或join
,例如:
t1.detach();
t2.detach();
在comp2()
内。
这将净化您的预期行为。