Согласно тому, что написано о будущее в «языке программирования C ++ 4-е издание»
§5.3.5.1 стр. 120:
Если значение еще не достигнуто, наш поток блокируется, пока не будет получен.
Означающий, что получить() это метод блокировки.
Далее в §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
}
Это имеет смысл, так как согласно цитате следующая программа не вернется, пока comp2 () функция завершена даже без вызова присоединиться() на них, так как поток, который называется comp2 () будет ждать будущеепока они получить() их ценность:
int main()
{
vector<double> v {1.1, 8.3, 5.6};
double res = comp2(v);
return 0;
}
К сожалению, этого не происходит, как я думал, и я меньше звоню присоединиться()
на 2 темы в comp2 (), во время выполнения будет сгенерирована ошибка.
Может ли кто-нибудь объяснить мне, что мне здесь не хватает и почему получить() не блокирует?
Я отладил ваш код с помощью gdb, ваша ошибка во время выполнения происходит в деструкторе std :: thread. Вы должны либо detach
или же join
их, прежде чем они будут уничтожены, например:
t1.detach();
t2.detach();
внутри comp2()
,
Это приведет к ожидаемому поведению.