2026-03-26 16:45:24 +08:00
|
|
|
# TaskGroup::Cancel
|
|
|
|
|
|
2026-03-26 20:59:59 +08:00
|
|
|
取消任务组中的未完成任务。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
void Cancel();
|
|
|
|
|
```
|
|
|
|
|
|
2026-03-26 20:59:59 +08:00
|
|
|
## 行为说明
|
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
|
|
|
1. 加锁。
|
|
|
|
|
2. 把 `m_canceled` 设为 `true`。
|
|
|
|
|
3. 遍历 `m_tasks`。
|
|
|
|
|
4. 对每个 `task != nullptr` 且 `completed == false` 的节点调用 `task->OnCancel()`。
|
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
|
|
|
- 无。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
2026-03-26 20:59:59 +08:00
|
|
|
## 当前实现限制
|
|
|
|
|
|
|
|
|
|
- 当前不会把任务状态改成 `TaskStatus::Canceled`。
|
|
|
|
|
- 当前不会减少 `m_pendingCount`,因此也不会让 [Wait](Wait.md) / [IsComplete](IsComplete.md) 表现为“任务组结束了”。
|
|
|
|
|
- 当前不会通知条件变量。
|
|
|
|
|
- 当前不会释放任务对象。
|
|
|
|
|
- `OnCancel()` 是在任务组内部锁保护下调用的;如果回调里再次操作同一个 `TaskGroup`,可能引入重入问题。
|
|
|
|
|
|
|
|
|
|
## 设计说明
|
|
|
|
|
|
|
|
|
|
真正可用的取消语义通常至少要覆盖三件事:
|
|
|
|
|
|
|
|
|
|
- 阻止尚未开始的任务继续进入执行。
|
|
|
|
|
- 让等待方得到确定的结束信号。
|
|
|
|
|
- 让任务对象生命周期仍然可控。
|
|
|
|
|
|
|
|
|
|
当前实现只覆盖了“通知任务自己被取消”这一层。
|
2026-03-26 16:45:24 +08:00
|
|
|
|
|
|
|
|
## 相关文档
|
|
|
|
|
|
2026-03-26 20:59:59 +08:00
|
|
|
- [返回类型总览](TaskGroup.md)
|
|
|
|
|
- [Wait](Wait.md)
|
|
|
|
|
- [ITask::OnCancel](../Task/OnCancel.md)
|