Skip to content

Latest commit

 

History

History
73 lines (52 loc) · 1.99 KB

README_PotatoTaskSystem.md

File metadata and controls

73 lines (52 loc) · 1.99 KB

PotatoTaskSystem

基于线程池的多线程任务系统

import PotatoTaskSystem;
using namespace Potato::Task;

TaskSyetem内部维护了一个基于std::thread的内存池,并维护了一个单一任务队列,每一个线程都被赋予了特定的属性和权限,以控制其从任务队列获取任务的能力。

一般流程:

  1. 定义创建一个实例,并且拉起对应的线程:

    TaskContext conotext;
    context.AddGroupThread({}, TaskContext::GetSuggestThreadCount());

    所有往这个Context提交的任务和内部维护的线程池,在Context销毁后都会销毁。

  2. 创建Task

    std::size_t Count = 0;
    // 从 lambda 创建一个任务
    Task::Ptr Lambda = Task::CreateLambdaTask([&Count](Potato::Task::TaskContextWrapper& Status, Potato::Task::Task& This){
    	std::println("Count :{0} {1} {2}", Count, static_cast<std::size_t>(Status.status), Status.thread_id);
    	Count++;
    	if(Count <= 20)
    		// 只循环提交20次,20次之后就不再循环
    		Status.context.CommitDelayTask(&This, std::chrono::milliseconds{50}, Status.task_property);
    });
    
    // 创建自定义的任务
    struct UserTask : public Task
    {
    	// 需要自己提供引用计数的功能
    	virtual void AddTaskRef() const;
    	virtual void SubTaskRef() const;
    
    	// 处理任务的执行
    	virtual void TaskExecute(TaskContextWrapper& status);
    
    	// 处理任务的中断(如TaskContext)时的回调
    	virtual void TaskTerminal(TaskProperty property) noexcept {};
    	
    };
  3. 提交

    // 标志该任务的优先级与可达性
    TaskProperty tp;
    
    // GLOBAL_TASK 指任意线程均可执行,也可以指定某个Group的线程池或者某个特定线程
    tp.filter.category = Category::GLOBAL_TASK;
    
    // 提交并立即执行
    context.CommitTask(Lambda, tp);
    
    // 延时提交
    context.CommitDelayTask(Lambda, std::chrono::milliseconds{ 50 }, tp);
  4. 堵塞并尝试运行Task,直到所有任务被执行完毕

    context.ProcessTaskUntillNoExitsTask({});