首页 > 解决方案 > 何时更喜欢 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();
        

我已经检查了答案,但没有一个给我合适的用例。看起来编码员可以使用这些方法中的任何一种,但是什么时候一个分数高于另一个?

标签: c++multithreadingc++11stdasync

解决方案


不需要. _ std::packaged_task_std::async

std::packaged_task当您自己管理线程但仍需要使用std::future. 这意味着拥有通过std::thread或通过其他方式实现的工作线程或线程池。

std::packaged_task做与异步任务相关的其他事情:

  • std::future结果的包装
  • 转发时复制参数,而不是通过“通用引用”传递它们
  • 确保只移动语义而不是可复制(lambdas 或std::function可以复制,std::packaged_task不能)

推荐阅读