如何快速上手Marl:10分钟完成第一个多任务调度程序
【免费下载链接】marlA hybrid thread / fiber task scheduler written in C++ 11项目地址: https://gitcode.com/gh_mirrors/ma/marl
Marl是一个用C++11编写的混合线程/纤程任务调度器,能帮助开发者轻松实现高效的多任务并发处理。本文将带你快速掌握Marl的核心使用方法,从零开始构建一个简单的多任务调度程序。
准备工作:获取Marl源码
首先需要克隆Marl项目仓库到本地:
git clone https://gitcode.com/gh_mirrors/ma/marl核心概念:Marl任务调度基础
Marl的核心是scheduler(调度器),它负责管理任务的分发和执行。调度器需要绑定到线程,并且会阻塞直到所有线程解绑。主要包含以下关键组件:
- Worker:工作单元,每个Worker持有任务队列和纤程状态
- Task:要执行的任务单元,通过
marl::schedule()提交 - WaitGroup:用于等待一组任务完成的同步原语
- Event:用于线程间通信的事件信号机制
实战步骤:编写第一个多任务程序
我们将使用examples/hello_task.cpp作为基础,创建一个简单的多任务调度程序。
步骤1:配置并初始化调度器
首先需要包含必要的头文件,并创建调度器实例:
#include "marl/defer.h" #include "marl/event.h" #include "marl/scheduler.h" #include "marl/waitgroup.h" int main() { // 创建调度器配置,设置4个工作线程 marl::Scheduler::Config cfg; cfg.setWorkerThreadCount(4); marl::Scheduler scheduler(cfg); scheduler.bind(); // 绑定调度器到当前线程 defer(scheduler.unbind()); // 确保程序结束前解绑 // ... }步骤2:创建同步原语
使用Event和WaitGroup来协调多个任务:
// 创建手动重置的事件 marl::Event sayHello(marl::Event::Mode::Manual); // 创建等待组,初始计数为任务数量 marl::WaitGroup saidHello(numTasks);步骤3:调度任务
通过循环创建多个任务并提交给调度器:
constexpr int numTasks = 10; for (int i = 0; i < numTasks; i++) { // 提交任务到调度器 marl::schedule([=] { // Marl原语支持按值捕获 defer(saidHello.done()); // 任务完成时递减等待组计数 printf("Task %d waiting to say hello...\n", i); sayHello.wait(); // 等待事件信号 printf("Hello from task %d!\n", i); }); }步骤4:触发事件并等待完成
sayHello.signal(); // 发送事件信号,解除所有任务阻塞 saidHello.wait(); // 等待所有任务完成 printf("All tasks said hello.\n");运行与理解
当程序运行时,调度器会将10个任务分配到4个工作线程执行。所有任务会先等待sayHello事件信号,一旦信号发出,所有任务将同时执行并打印消息。
Marl的优势在于,即使任务中包含阻塞操作(如wait()),调度器也会智能地切换到其他可执行任务,充分利用系统资源。
深入学习
- 官方文档:docs/scheduler.md
- 更多示例:examples/
- 调度器实现:src/scheduler.cpp
通过这个简单示例,你已经掌握了Marl的基本使用方法。Marl还提供了更多高级特性,如任务依赖管理、并行化算法等,等待你进一步探索!
【免费下载链接】marlA hybrid thread / fiber task scheduler written in C++ 11项目地址: https://gitcode.com/gh_mirrors/ma/marl
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考