旋转栅vs互斥

时间:2018-11-30 21:43:13

标签: multithreading concurrency operating-system synchronization mutex

该问题与称为Turnstile的同步机制有关。可以在hereherehere中找到实现和文档的示例。经过研究后,我仍然找不到以下问题的答案。

  • 旋转栅门能解决什么问题?
  • 与互斥锁相比,旋转栅门有什么优势?
  • 线程和旋转栅门之间的所有权关系是什么? (如果有)。
  • 如果我们减少了这些实现的复杂性,那么旋转栅门的最小骨架是什么?

1 个答案:

答案 0 :(得分:0)

在更详细地阅读了solaris文档之后,我掌握了基本思想,因此我将回答我自己的问题。

  

旋转栅门能解决什么问题?   与互斥锁相比,旋转栅门有什么优势?   螺纹和旋转门之间的所有权关系是什么? (如果有)。

Turnstile可以帮助减少互斥量(或任何其他同步单元)。当我们想使用旋转栅栏保护带有某个锁的对象时,该锁将成为轻量级对象,它将所有操作委托给旋转栅栏。每个线程最多可以关联一个旋转门。因此,#turnstiles≤#threads。这种方法有助于减少非活动锁的数量。但是,螺纹和旋转门AFAIK之间没有明确的所有权。

  

如果我们降低这些实现的复杂性,那么什么是裸露的   旋转门的骨头最小结构?

我们可以通过以下方式实施幼稚的旋转栅门。

使用操作Turnstilesget分配put的全局池(显然,它必须是线程安全的)。对于池,无锁堆栈可能是一个相对容易且有效的实现。 TurnstileLock是将替换我们的锁和互斥并将责任委托给Turnstile的对象。 TurnstileLock持有指向Turnstile的可空指针。

当某个线程想要进入由TurnstileLock保护的关键部分时,它将检查TurnstileLock.currentTurnstile是否为空(默认情况下必须为空)。

  • 如果为null,则线程从池中抽出一个旋转栅并将其分配给TurnstileLock.currentTurnstile,递增TurnstileLock.currentTurnstile.waitingCount并进入关键部分。
  • 否则,线程必须递增TurnstileLock.currentTurnstile.waitingCount并等待必须通过currentTurnstile访问的某些条件变量

当某个线程想要离开关键部分(或释放锁)时,它必须检查TurnstileLock.currentTurnstile.waitingCount > 0(在减小之后)

  • 如果是,则需要通知条件变量其他线程正在睡眠。
  • 否则将TurnstileLock.currentTurnstile放回池中,并将TurnstileLock.currentTurnstile设置为空