c++ - 何时更喜欢 lambda 而不是带有 std::async 的打包任务?
问题描述
我有点困惑,因为我什么时候需要将 packaged_task 传递给 std::async。当我可以直接传递带有参数的函数时,我真的需要 std::packaged_task 吗?有什么东西只能通过打包任务而不是正常的功能方法来实现吗?
方法 1:带有 lambda 函数的 std::async
std::future<int> result= std::async(std::launch::async, [](int m, int n) { return m + n;} , 2, 4));
方法 2:std::async 与 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), 2, 4);
int ans = result.get();
我已经检查了答案,但没有一个给我合适的用例。看起来编码员可以使用这些方法中的任何一种,但是什么时候一个分数高于另一个?
解决方案
你不需要. _ std::packaged_task
_std::async
std::packaged_task
当您自己管理线程但仍需要使用std::future
. 这意味着拥有通过std::thread
或通过其他方式实现的工作线程或线程池。
std::packaged_task
做与异步任务相关的其他事情:
std::future
结果的包装- 转发时复制参数,而不是通过“通用引用”传递它们
- 确保只移动语义而不是可复制(lambdas 或
std::function
可以复制,std::packaged_task
不能)
推荐阅读
- javascript - Nuxt 代理配置:如何创建使用阵列模式?
- oracle - 更新包含两个日期的选择列表
- css - IE11 中的 background-size 属性是否不可动画?
- r - 无法使用 $navigate 在 R 中打开网站
- lua - Gmod lua 尝试用错误的键索引字符串值('addMoney' 不是字符串库的一部分)
- python - 字符串操作 像在 python 中一样重复字母
- node.js - spotify api 获取艺术家
- python - 有没有办法将函数应用于 Python 中另一个函数/方法的每个参数?
- android - Exoplayer - 如何让 exoplayer 只播放当前可见的视频
- r - ShinyApp 工作,但 runApp 没有 R