Lobsters | 原文链接 | 2026-09-10 收录

Solaris 的旋转门(Turnstile):把互斥锁的等待者状态挪到锁外面,还顺带解决优先级反转

来源: rdmsr.github.io — 2026-09-08

概述

这篇技术长文把 Solaris 里一个少见被讨论、却悄悄传遍全世界的发明讲透了:turnstile(旋转门)。背景是 Solaris 为了接近软实时的延迟表现,大量采用阻塞式互斥锁,但阻塞锁带来两个问题——每个锁若都要内建完整的「谁持有、谁在等、怎么叫醒」簿记,代价太高;以及低优先级持锁者会挡住高优先级任务的优先级反转。优先级继承的思路是让持锁者临时借走高优先级的优先级,并沿 owner 链多跳传播。turnstile 的精妙在于把这份状态从锁里拿出来:每个线程创建时就自带一个 turnstile,一旦被阻塞就把它「捐赠」给所等的锁,内核用锁地址的哈希表来定位它,释放时线程再从 freelist 随便取一个。正因为这套空间节省思想,它如今出现在 Illumos、macOS 的 XNU、FreeBSD、NetBSD 甚至 Go 运行时与 WebKit 的 WTF::ParkingLot 里——后者把昂贵的等待机制同样从锁里剥了出来。

核心要点

金句

The difference between a turnstile and the lock is that the expensive waiter machinery lives outside the lock itself.
返回 Lobsters 首页