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` 中。然後我們獲取異步任務的結果,並在另一個線程中執行該任務,最後輸出異步任務的結果。這樣就實現了一個簡單的異步任務執行過程。希朿這個例子有幫助!如果有任何疑問,請隨時提出。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章