全景
这一部分先回答「parking_lot 是什么、和 std 的锁差在哪」,再把两条调用链从头到尾走一遍。每一步只画到「调用了哪个函数、读写了哪个状态位或队列」,细节留给后面的部分,每一步都链过去。
- parking_lot 解决什么问题:停车场的想法和它的出处;和 std 的分工(大小、毒化、公平、Condvar 语义、可定制性、平台实现);三层 crate;前几卷里谁在用;「比 std 快」这句话从哪来,本卷怎么检验。
- 一次有竞争的加锁:B 抢锁失败、自旋、置
PARKED_BIT、停车;A 解锁、在桶锁里决定是直接把锁交给 B(TOKEN_HANDOFF),还是放开锁让 B 回去重抢。 - 一次 notify_all:等待者以 condvar 的地址为 key 停车;
notify_all时 mutex 被锁着就一个都不叫醒、全部挪到 mutex 的队列,没被锁就叫醒一个、挪走其余;返回值为什么不是「叫醒了几个」。
flowchart LR why[停车场解决什么问题] --> lock["一次有竞争的加锁:RawMutex + park / unpark_one"] why --> notify["一次 notify_all:Condvar + unpark_requeue"] notify -->|"被挪走的线程由 mutex 的 unlock 逐个叫醒"| lock
两条主线是串起来的:notify_all 把等待者挪到 mutex 的队列之后,它们就是主线 1 里那些「在 mutex 上停车的线程」,由 mutex 的 unlock 一个一个叫醒。第三条主线(全局哈希表的一生)没有单独的全景页,放在 停车场哈希表 开头。
💬 关联讨论
发起讨论加载中...