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
方法,以避免程序提前退出。