问题描述
我有点困惑,因为我什么时候需要将 packaged_task 传递给 std::async。当我可以直接传递带参数的函数时,我真的需要 std::packaged_task 吗? 有什么东西只能用打包的任务而不是普通的函数方法吗?
std::future<int> result= std::async(std::launch::async,[](int m,int n) { return m + n;},2,4));
方法 2:std::async with packaged_task,
auto f = [](int m,int n) { return m + n;};
std::packaged_task<int(int,int)> task(f);
std::future<int> result = task.get_future();
std::async(std::launch::async,std::move(task),4);
int ans = result.get();
我已经检查了答案,但没有一个给我一个正确的用例。看起来编码人员可以只使用这些方法中的任何一种,但是什么时候一个比另一个得分高?
解决方法
您不需要为std::packaged_task
需要std::async
。
std::packaged_task
在您自己管理线程但仍需要带有 std::future
的可调用包装器时很有用。这意味着拥有通过 std::thread
或其他方式实现的工作线程或线程池。
std::packaged_task
做其他与异步任务相关的事情:
-
std::future
包装结果 - 在转发时复制参数,而不是通过“通用引用”对它们进行分配
- 确保仅移动语义而不是可复制(lambda 或
std::function
可以复制,std::packaged_task
不能)