Tokio 进程调度器中的 Inject 和 Idle 的统一互斥锁是否可以安全地分割?
作者: foreverjun创建于 2025年4月2日更新于 2026年9月7日
标签C-questionA-tokioM-runtimeT-performance
你好,我一直在研究 Tokio 的源代码,以探索潜在的性能改进,特别是全局任务队列。我正在考虑用无锁实现替换 inject 队列,以减少竞争。但是,我注意到 Synced 结构中的 inject 和 idle 目前都受单个 Mutex 保护: pub(crate) struct Synced { pub(super) idle: idle::Synced, pub(crate) inject: inject::Synced, } 这定义在 worker.rs。最初我以为这是为了确保状态一致性,例如防止线程在将任务添加到 inject 后立即停车,而错过任务,因为存在竞争。但是,仔细查看代码后,我没有找到任何关键区域,可能会出现这种情况。 此更改于 2023 年 添加。在此之前, inject 和 idle 具有单独的 Mutex,并且调度器似乎工作正常。看来“停车/解除停车”逻辑自那时以来并没有发生显著变化。 如果有人能帮助我:
- 统一的 inject 和 idle Mutex 在当前设计中是否提供了我可能会忽略的特定优势?
- 将全局队列 (inject) 与 Synced 分离并使其无锁是否安全,或者是否会引入微妙的问题 (例如,停车和任务注入之间的竞争)?
- 由于代码历来使用单独的 Mutex,是否有理由现在偏好单个 Mutex,除了简单性之外? 我会很感激如果有人能提供任何见解或指向我应该仔细检查的代码部分。谢谢!
内容来源: tokio-rs/tokio