C++20 引入了協程(coroutines),使得異步編程變得更加簡單和直觀。要實現任務調度,我們可以使用 std::future
和 std::promise
來在協程之間傳遞數據,以及使用 std::jthread
或 std::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
方法,以避免程序提前退出。