Rust in Everything
基于 parking_lot 0.12.5

全景

这一部分先回答「parking_lot 是什么、和 std 的锁差在哪」,再把两条调用链从头到尾走一遍。每一步只画到「调用了哪个函数、读写了哪个状态位或队列」,细节留给后面的部分,每一步都链过去。

  1. parking_lot 解决什么问题:停车场的想法和它的出处;和 std 的分工(大小、毒化、公平、Condvar 语义、可定制性、平台实现);三层 crate;前几卷里谁在用;「比 std 快」这句话从哪来,本卷怎么检验。
  2. 一次有竞争的加锁:B 抢锁失败、自旋、置 PARKED_BIT、停车;A 解锁、在桶锁里决定是直接把锁交给 B(TOKEN_HANDOFF),还是放开锁让 B 回去重抢。
  3. 一次 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 一个一个叫醒。第三条主线(全局哈希表的一生)没有单独的全景页,放在 停车场哈希表 开头。

💬 关联讨论

发起讨论
加载中...