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` 中。然后我们获取异步任务的结果,并在另一个线程中执行该任务,最后输出异步任务的结果。这样就实现了一个简单的异步任务执行过程。希朿这个例子有帮助!如果有任何疑问,请随时提出。

 

posted @ 2024-03-24 15:30  He_LiangLiang  阅读(5)  评论(0编辑  收藏  举报