91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

c++ coroutine如何實現任務調度

c++
小樊
81
2024-11-23 12:18:22
欄目: 編程語言

C++20 引入了協程(coroutines),使得異步編程變得更加簡單和直觀。要實現任務調度,我們可以使用 std::futurestd::promise 來在協程之間傳遞數據,以及使用 std::jthreadstd::thread 來執行協程。

以下是一個簡單的任務調度示例,展示了如何使用 C++20 協程實現任務調度:

#include <iostream>
#include <chrono>
#include <future>
#include <vector>
#include <thread>
#include <functional>

// 定義一個協程任務
std::future<void> asyncTask(int taskId) {
    std::cout << "Task " << taskId << " started." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1)); // 模擬耗時操作
    std::cout << "Task " << taskId << " completed." << std::endl;
    return std::async(std::launch::deferred, []() {}); // 返回一個 future 對象
}

// 任務調度器
class TaskScheduler {
public:
    void addTask(int taskId) {
        tasks.emplace_back([taskId]() { asyncTask(taskId); });
    }

    void run() {
        std::vector<std::jthread> threads;
        for (auto& task : tasks) {
            threads.emplace_back([&task]() { task(); });
        }

        for (auto& thread : threads) {
            thread.join();
        }
    }

private:
    std::vector<std::function<void()>> tasks;
};

int main() {
    TaskScheduler scheduler;
    scheduler.addTask(1);
    scheduler.addTask(2);
    scheduler.addTask(3);

    scheduler.run();

    return 0;
}

在這個示例中,我們創建了一個 TaskScheduler 類,用于添加和管理任務。addTask 方法接受一個任務 ID,并將其添加到任務列表中。run 方法創建一個線程池,并為每個任務分配一個線程來執行。當所有任務完成后,主線程將等待所有子線程完成。

請注意,這個示例使用了 std::jthread,它是 C++20 中用于處理協程的線程類。std::jthread 在析構時會自動加入(join)線程,因此我們不需要顯式調用 join 方法。如果你使用的是 std::thread,則需要在每個線程完成時調用 join 方法,以避免程序提前退出。

0
来安县| 交城县| 南投市| 绥棱县| 新安县| 铅山县| 绥中县| 安康市| 肥东县| 颍上县| 九龙城区| 北安市| 陵川县| 韶山市| 项城市| 门头沟区| 平舆县| 宜州市| 电白县| 女性| 皮山县| 贺兰县| 绿春县| 崇阳县| 鄂州市| 牡丹江市| 鸡西市| 舟山市| 桐柏县| 聊城市| 大名县| 大港区| 沙湾县| 淮阳县| 本溪市| 惠州市| 大余县| 临桂县| 高安市| 文安县| 黄平县|