C++20 引入了协程(coroutines),使得异步编程变得更加简单和直观。要实现任务调度,我们可以使用 std::future 和 std::promise 来在协程之间传递数据,以及使用 std::jthread 或 std::thread 来执行协程。
以下是一个简单的任务调度示例,展示了如何使用 C++20 协程实现任务调度:
#include
#include
#include
#include
#include
#include
// 定义一个协程任务
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 threads;
for (auto& task : tasks) {
threads.emplace_back([&task]() { task(); });
}
for (auto& thread : threads) {
thread.join();
}
}
private:
std::vectorvoid()>> 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 方法,以避免程序提前退出。
以上就是关于“c++ coroutine如何实现任务调度”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm