Files
XCEngine/docs/api/XCEngine/Threading/TaskGroup/AddTask.md

1.9 KiB
Raw Blame History

TaskGroup::AddTask

向任务组添加一个任务对象或 lambda 任务。

uint64_t AddTask(std::unique_ptr<ITask> task);
uint64_t AddTask(Callback&& func, TaskPriority priority = TaskPriority::Normal);

行为说明

AddTask(std::unique_ptr<ITask>) 当前会:

  1. 加锁保护 m_tasks
  2. 取出 task.get() 保存到内部 TaskNode::task
  3. 用当前 m_tasks.size() 作为返回的任务 ID。
  4. 把节点追加到 m_tasks
  5. 递增 m_pendingCount
  6. 对传入的 unique_ptr 调用 release()

AddTask(Callback&&, TaskPriority) 会先构造一个 LambdaTask<Callback>,然后转发到上面的重载。

参数

  • task - 要加入任务组的任务对象。
  • func - 要包装成 lambda 任务的可调用对象。
  • priority - lambda 任务的优先级。

返回值

  • 返回任务在当前任务组内的索引式 ID。

当前实现限制

  • 当前只把任务放进 TaskGroup 内部数组,不会提交到 TaskSystem 队列。
  • task.release() 之后,任务组接管的是裸指针,但当前析构函数不会释放这些对象。
  • pendingDepCount 是在节点尚未添加依赖时按 dependencies.size() 计算的,因此始终初始化为 0
  • 当前不会在这里更新任务状态,也不会触发任何执行逻辑。
  • 返回的任务 ID 仅是组内索引,不是 ITask::GetId 那种系统级任务 ID。

设计说明

把“组内任务 ID”和“系统任务 ID”分开本来是合理设计。前者适合描述组内依赖后者适合给全局调度器跟踪任务。

但当前实现只完成了最外层接口形状,还没有把这两套标识真正贯通起来。

相关文档