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

53 lines
1.9 KiB
Markdown
Raw Normal View History

2026-03-26 16:45:24 +08:00
# TaskGroup::AddTask
2026-03-26 20:59:59 +08:00
向任务组添加一个任务对象或 lambda 任务。
2026-03-26 16:45:24 +08:00
```cpp
uint64_t AddTask(std::unique_ptr<ITask> task);
2026-03-26 20:59:59 +08:00
uint64_t AddTask(Callback&& func, TaskPriority priority = TaskPriority::Normal);
2026-03-26 16:45:24 +08:00
```
2026-03-26 20:59:59 +08:00
## 行为说明
2026-03-26 16:45:24 +08:00
2026-03-26 20:59:59 +08:00
`AddTask(std::unique_ptr<ITask>)` 当前会:
2026-03-26 16:45:24 +08:00
2026-03-26 20:59:59 +08:00
1. 加锁保护 `m_tasks`
2. 取出 `task.get()` 保存到内部 `TaskNode::task`
3. 用当前 `m_tasks.size()` 作为返回的任务 ID。
4. 把节点追加到 `m_tasks`
5. 递增 `m_pendingCount`
6. 对传入的 `unique_ptr` 调用 `release()`
2026-03-26 16:45:24 +08:00
2026-03-26 20:59:59 +08:00
`AddTask(Callback&&, TaskPriority)` 会先构造一个 `LambdaTask<Callback>`,然后转发到上面的重载。
2026-03-26 16:45:24 +08:00
2026-03-26 20:59:59 +08:00
## 参数
2026-03-26 16:45:24 +08:00
2026-03-26 20:59:59 +08:00
- `task` - 要加入任务组的任务对象。
- `func` - 要包装成 lambda 任务的可调用对象。
- `priority` - lambda 任务的优先级。
2026-03-26 16:45:24 +08:00
2026-03-26 20:59:59 +08:00
## 返回值
2026-03-26 16:45:24 +08:00
2026-03-26 20:59:59 +08:00
- 返回任务在当前任务组内的索引式 ID。
2026-03-26 16:45:24 +08:00
2026-03-26 20:59:59 +08:00
## 当前实现限制
- 当前只把任务放进 `TaskGroup` 内部数组,不会提交到 [TaskSystem](../TaskSystem/TaskSystem.md) 队列。
- `task.release()` 之后,任务组接管的是裸指针,但当前析构函数不会释放这些对象。
- `pendingDepCount` 是在节点尚未添加依赖时按 `dependencies.size()` 计算的,因此始终初始化为 `0`
- 当前不会在这里更新任务状态,也不会触发任何执行逻辑。
- 返回的任务 ID 仅是组内索引,不是 [ITask::GetId](../Task/GetId.md) 那种系统级任务 ID。
## 设计说明
把“组内任务 ID”和“系统任务 ID”分开本来是合理设计。前者适合描述组内依赖后者适合给全局调度器跟踪任务。
但当前实现只完成了最外层接口形状,还没有把这两套标识真正贯通起来。
2026-03-26 16:45:24 +08:00
## 相关文档
2026-03-26 20:59:59 +08:00
- [返回类型总览](TaskGroup.md)
- [AddDependency](AddDependency.md)
- [ITask](../Task/Task.md)
- [LambdaTask](../LambdaTask/LambdaTask.md)