该问题与称为Turnstile的同步机制有关。可以在here,here和here中找到实现和文档的示例。经过研究后,我仍然找不到以下问题的答案。
答案 0 :(得分:0)
在更详细地阅读了solaris文档之后,我掌握了基本思想,因此我将回答我自己的问题。
旋转栅门能解决什么问题? 与互斥锁相比,旋转栅门有什么优势? 螺纹和旋转门之间的所有权关系是什么? (如果有)。
Turnstile可以帮助减少互斥量(或任何其他同步单元)。当我们想使用旋转栅栏保护带有某个锁的对象时,该锁将成为轻量级对象,它将所有操作委托给旋转栅栏。每个线程最多可以关联一个旋转门。因此,#turnstiles≤#threads。这种方法有助于减少非活动锁的数量。但是,螺纹和旋转门AFAIK之间没有明确的所有权。
如果我们降低这些实现的复杂性,那么什么是裸露的 旋转门的骨头最小结构?
我们可以通过以下方式实施幼稚的旋转栅门。
使用操作Turnstiles
和get
分配put
的全局池(显然,它必须是线程安全的)。对于池,无锁堆栈可能是一个相对容易且有效的实现。 TurnstileLock
是将替换我们的锁和互斥并将责任委托给Turnstile
的对象。 TurnstileLock
持有指向Turnstile
的可空指针。
当某个线程想要进入由TurnstileLock
保护的关键部分时,它将检查TurnstileLock.currentTurnstile
是否为空(默认情况下必须为空)。
TurnstileLock.currentTurnstile
,递增TurnstileLock.currentTurnstile.waitingCount
并进入关键部分。TurnstileLock.currentTurnstile.waitingCount
并等待必须通过currentTurnstile
访问的某些条件变量当某个线程想要离开关键部分(或释放锁)时,它必须检查TurnstileLock.currentTurnstile.waitingCount > 0
(在减小之后)
TurnstileLock.currentTurnstile
放回池中,并将TurnstileLock.currentTurnstile
设置为空