首页 > 编程语言 >C++创建异步任务

C++创建异步任务

时间:2024-03-24 15:47:00浏览次数:30  
标签:std 异步 task 函数 创建 packaged C++ 任务

    namespace Core
    {
        /**
         * 创建一个异步任务的包装函数,返回一个指向 std::packaged_task 的 shared_ptr。
         *
         * @tparam F 函数类型
         * @tparam Args 参数类型
         * @param f 要执行的函数
         * @param args 函数的参数
         * @return 指向 std::packaged_task 的 shared_ptr
         */
        template <class F, class... Args>
        auto makeFutureTask(F &&f, Args &&...args)
            -> std::shared_ptr<std::packaged_task<typename std::result_of<F(Args...)>::type()>>
        {
            using return_type = typename std::result_of<F(Args...)>::type;
            auto task = std::make_shared<std::packaged_task<return_type()>>(
                std::bind(std::forward<F>(f), std::forward<Args>(args)...));
            return task;
        }

        #define MAKE_FUTURE_TASK(F) [task] { (*task)(); }
    }

 

这段C++代码定义了一个函数模板 `makeFutureTask` 和一个宏 `MAKE_FUTURE_TASK`,它们结合使用可以用来创建异步任务。

1. **makeFutureTask 函数模板**:
- 参数:
- `F &&f`:表示一个可调用对象(函数、函数指针、lambda 表达式等);
- `Args &&...args`:表示可变数量的参数,用于传递给可调用对象 `f`。
- 返回类型:
- `std::shared_ptr<std::packaged_task<typename std::result_of<F(Args...)>::type()>>`:返回一个指向 `std::packaged_task` 的智能指针,`packaged_task` 是一个异步任务的包装类,它可以异步执行一个可调用对象,并获取其结果。

作用:
- 该函数模板的作用是创建一个异步任务(`std::packaged_task`),并返回指向该任务的智能指针。
- 使用 `std::bind` 将可调用对象 `f` 与参数 `args` 绑定,创建一个 `packaged_task` 对象,并将其存储在智能指针中返回。

2. **宏 MAKE_FUTURE_TASK**:
- 定义了一个 lambda 表达式,捕获了名为 `task` 的变量(即 `std::shared_ptr<std::packaged_task>`)。
- lambda 表达式的主体是调用 `(*task)()`,即执行 `packaged_task` 中所包装的可调用对象。

现在让我们来看一个示例,演示如何使用这些代码来创建异步任务:

#include <iostream>
#include <future>
#include <functional>

// 定义一个函数用于异步执行
int add(int a, int b) {
return a + b;
}

int main() {
// 创建一个异步任务,计算 3 + 4
auto task = makeFutureTask(add, 3, 4);

// 使用 std::future 来获取异步任务的结果
std::future<int> future = task->get_future();

// 在另一个线程中执行异步任务
std::thread(std::move(*task)).detach();

// 获取异步任务的结果并输出
std::cout << "Result: " << future.get() << std::endl;

return 0;
}

 

在这个示例中,我们使用 `makeFutureTask` 函数模板创建了一个异步任务,将 `add` 函数和参数 3、4 绑定到一个 `std::packaged_task` 中。然后我们获取异步任务的结果,并在另一个线程中执行该任务,最后输出异步任务的结果。这样就实现了一个简单的异步任务执行过程。希朿这个例子有帮助!如果有任何疑问,请随时提出。

 

标签:std,异步,task,函数,创建,packaged,C++,任务
From: https://www.cnblogs.com/music-liang/p/18092499

相关文章

  • C++共享之道:用extern实现源文件变量与类成员函数的巧妙共享
    概述:在C++中,使用`extern`关键字可实现在源文件之间共享变量与类成员函数。通过声明变量或类在头文件中,再在一个源文件中定义,其他源文件通过`extern`引用,促使模块化、可维护的代码组织。在C++中,extern关键字可用于在源文件之间共享变量。它告诉编译器某个变量的声明在其他源文......
  • Java为什么创建一个字符串对象需要在内存中创建两份
    在Java中,当你使用Strings=newString("abc")这样的语法创建一个字符串时,实际上会在内存中创建两个对象。这是因为Java中的字符串分为两种类型:一种是使用字面量的方式创建的字符串,另一种是通过new关键字创建的字符串。当我们使用字面量方式创建字符串时,例如Strings="a......
  • 最长子字符串的长度(二)【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-最长子字符串的长度(二)给你一个字符串s,字符串s首尾相连成一个环形,请你在环中找出’l’、‘o’、‘x’字符都恰好出现了偶数次最长子字符串的长度。输入描述:输入是一串小写的字母组成的字符串。输出描述:输出是一个整数补充说明:1<=s.length<=5x10^5......
  • 孙悟空吃蟠桃【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-孙悟空吃蟠桃孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有N颗桃树,每颗树上都有桃子,守卫将在H小时后回来。孙悟空可以决定他吃蟠桃的速度K(个/小时),每个小时选一颗桃树,并从树上吃掉K个,如果树上的桃子少于K个,则全部吃掉,并且这一小时剩余的时间里不再......
  • C++学生信息管理 1.0记录
    C++学生信息管理1.0记录 该信息管理没有太多可支持的操作,仅有一些基础设置,后续优化中将添加更多功能。一.头文件引用和命名空间声明#include<iostream>//输入输出操作#include<string>//字符串操作usingnamespacestd;//为方便使用,不需要在cout,string等前方加......
  • C++:map&set 对红黑树的封装
    C++:map&set对红黑树的封装将红黑树封装为泛型Find接口迭代器insert接口map的operator[]接口总代码展示C++的STL库中,把红黑树封装为了两个容器map与set,本博客将基于红黑树,来实现map和set的封装。如果不了解红黑树,可见博客[数据结构/C++:红黑树]将红黑树封装为泛型......
  • 【每周例题】力扣 C++ 两数之和
    两数之和题目 题目分析1.返回两个数的下标和,第一反应可以是采用双for循环2.数组数值等于整数目标值,那就采用if判断,符合直接输出,跳出循环,避免输出多个答案3.由于力扣题目采用了容器,大家可以选择点击该链接了解:容器代码#include<iostream>#include<vector>usingnamesp......
  • 【每周例题】力扣 C++ 组合
    组合题目力扣组合 题目解析1.我们可以根据题目分析可知,题目所要求我们做的是:从1到n进行遍历,找出k个数组成小组合,再将小组合拼接在一起成为大组合输出。2.所以,根据题目,我们可以采用两个数组,一个一维数组temp,负责存储k个数,组为小组合,一个二维数组res,存储小组合,变为大组合。......
  • 【webserver】 C++ 项目webserver面试八股总结(二)
    32.一次网页的访问从URL开始,说一下整个访问的过程客户端获取URL->DNS解析->TCP连接->发送HTTP请求->服务器处理请求->返回报文->浏览器解析渲染页面->TCP断开连接客户端:(应用层开始)获取URL,通过负责域名解析的域名服务获取网址的IP地址,根据HTTP协......
  • openstack云平台创建卷以及使用卷挂载
    参考:openstack上创建云主机步骤:打开卷,选择创建名称为test-lv大小为10GB 创建卷好之后,还需要和实例关联才可以使用,点击编辑卷下拉列表框中选择管理连接 使用SSH登录云主机控制台,查看磁盘情况 对磁盘进行分区 格式化磁盘,挂载在/mnt目录下写入一个test文件 ......