std::packaged_task包装一个可调用的对象,并且允许异步获取该可调用对象产生的结果,从包装可调用对象意义上来讲,std::packaged_task与std::function类似,只不过std::packaged_task将其包装的可调用对象的执行结果传递给一个 std::future 对象(该对象通常在另外一个线程中获取std::packaged_task任务的执行结果)。
}intmain(){// 创建一个 std::packaged_task,包装 square 函数std::packaged_task<int(int)>task(square);// 获取关联的 std::future 对象,用于获取任务结果std::future<int> result = task.get_future();// 将任务交给一个线程异步执行std::threadt(std::move(task),5);// 传递参数5给square函数t....
std::packaged_task<int(conststd::vector<int>&)>lambda_pask_task(sum_labmda); 首先,类模版packaged_task需要传入一个模版参数,这里传入的是int(const std::vector<int>&),该参数是用来告诉packaged_task其接受的可调用对象对应的函数调用签名是什么,这里第1个int是用来代表可调用对象返回值类型是int,其接受...
传递给std::packaged_task的模板参数是函数签名,如void()或int(std::string&,double*),而构造对象时传入的函数或可调用对象的参数和返回值必须一样或可转换为签名中对应的类型,如构造std::packaged_task<double(double)>类型的对象时可传入float func(int i)函数作为参数。 一个packaged_task<std::string(std:...
任务队列:你可以创建一个std::packaged_task的队列,将任务放入队列中,并由一个或多个工作线程来执行这些任务。 Future/Promise模型:你可以使用std::packaged_task实现Future/Promise模型,其中std::future用于获取结果,std::packaged_task用于执行任务并存储结果。
std::packaged_task可以包装一个任务(task),这个任务是一个可调用对象(Callable Object),对象保存此任务执行后的值,通常会将此值与另外线程中的std::future对象共享。所以packaged_task对象有两个最基本的元素: 被打包的任务(task),是一个可调用对象
std::packaged_task<int(int, int, int&)> pt1(Test_Fun); //声明一个std::future对象fu1,包装Test_Fun的返回结果类型,并与pt1关联 std::future<int> fu1 = pt1.get_future(); //声明一个变量 int c = 0; //创建一个线程t1,将pt1及对应的参数放到线程里面执行 ...
std::packaged_task<>是类模板,其模板参数是函数签名(function signature):譬如,void()表示一个函数,不接收参数,也没有返回值;又如,int(std::string&,double*)代表某函数,它接收两个参数并返回int值,其中,第一个参数是非const引用,指向std::string对象,第二个参数是double类型的指针。
包装任务:std::packaged_task构造函数可以接受一个函数或者一个可调用对象,这个函数或者对象就是需要异步执行的任务。 获取结果:std::packaged_task提供了一个get_future()方法,这个方法返回一个std::future对象,我们可以通过这个对象获取任务的结果。 执行任务:std::packaged_task对象可以像函数一样被调用,调用它就会...
类模板std::packaged_task包装任何可调用(Callable)目标(函数、lambda 表达式、bind 表达式或其他函数对象),使得能异步调用它。其返回值或所抛异常被存储于能通过std::future对象访问的共享状态中。 正如std::function,std::packaged_task是多态、具分配器的容器:可在堆上或以提供的分配器分配其所存储的可调用目标。