std::packaged_task
时间: 2023-04-25 21:04:30 浏览: 124
`std::packaged_task` 是 C++11 中的一个模板类,它可以将一个可调用对象(比如函数、函数对象或者 Lambda 表达式)与一个 future 关联起来,从而实现异步调用。它将一个异步操作封装成一个可调用对象,并将结果通过 future 来传递,可以在多线程环境下使用。
通过 `std::packaged_task` 可以将一个任务异步化,将任务的计算与任务的执行分离,使得任务可以在另外一个线程中执行,从而实现并发执行多个任务,提高程序的效率。
相关问题
c++std::packaged_task
c++的std::packaged_task是一个模板类,用于在异步操作中封装任务。它将一个可调用对象(例如函数、函数对象、Lambda表达式等)与一个future对象关联起来,使得任务可以异步执行,并获得返回值。
使用std::packaged_task的步骤如下:
1. 创建一个std::packaged_task对象,将可调用对象作为参数传入构造函数中。
2. 调用std::packaged_task的operator()方法来执行任务,也可以通过std::thread等线程库来执行任务。
3. 通过std::packaged_task的get_future()方法获取与之关联的future对象,用于获取任务的返回值。
4. 在需要的地方,通过future对象的get()方法来获取异步任务的返回值。
std::packaged_task的一个主要特点是可以将任务的执行与返回值的获取分开处理,这使得我们可以在需要的时候才去获取返回值,而不必阻塞程序的执行。另外,std::packaged_task还可以与std::thread等线程库结合使用,实现真正的并发执行。
总之,通过使用std::packaged_task,我们可以将一个任务封装起来,并异步执行,同时可以在需要的时候获取返回值。这为编写并发程序提供了更灵活和高效的方式。
request for member ‘get_future’ in ‘task’, which is of non-class type ‘std::packaged_task<int(__gnu_cxx::__normal_iterator<int*, std::vector<int> >, __gnu_cxx::__normal_iterator<int*, std::vector<int> >)>(accumulate_block<__gnu_cxx::__normal_iterator<int*, std::vector<int> >, int> (*)())’ futures[i]=task.get_future();
这个错误的原因是`task`变量的类型不是一个类类型,因此不能调用`get_future()`函数。在这里,`task`的类型是一个函数类型,它返回一个`std::packaged_task`对象,而不是一个`std::packaged_task`对象本身。
要解决这个错误,需要在创建`std::packaged_task`对象时使用函数类型的别名或函数指针类型。例如,如果要使用函数类型别名`Func`来定义`std::packaged_task`对象,可以这样写:
```c++
using Func = int(std::vector<int>::iterator, std::vector<int>::iterator);
std::packaged_task<Func> task(accumulate_block<int>);
```
或者,使用函数指针类型`FuncPtr`定义`std::packaged_task`对象,可以这样写:
```c++
using FuncPtr = int(*)(std::vector<int>::iterator, std::vector<int>::iterator);
std::packaged_task<FuncPtr> task(&accumulate_block<int>);
```
这样可以确保`task`的类型为`std::packaged_task`,从而可以调用`get_future()`函数获取与任务关联的`std::future`对象。
阅读全文