首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转门对互助器

转门对互助器
EN

Stack Overflow用户
提问于 2018-11-30 21:43:13
回答 1查看 1K关注 0票数 2

这个问题与一种叫做Turnstile的同步机制有关。实现和文档的示例可以找到这里这里这里。在做了一些研究之后,我仍然找不到以下问题的答案。

  • 转门解决了什么问题?
  • 相对于互斥,回转栅极有什么优势?
  • 线程和转门之间的所有权关系是什么?(如有的话)。
  • 如果我们降低了这些实现的复杂性,那么转门的最基本的最小结构是什么?
EN

回答 1

Stack Overflow用户

发布于 2018-12-28 08:57:14

在更彻底地阅读了solaris文档之后,我能够理解基本的想法,所以我将回答我自己的问题。

转门解决了什么问题?相对于互斥,回转栅极有什么优势?线程和转门之间的所有权关系是什么?(如有的话)。

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

如果我们降低了这些实现的复杂性,那么转门的最基本的最小结构是什么?

我们可以通过以下方式实现天真的旋转栅门。

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

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

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

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

  • 如果是,则需要通知其他线程正在休眠的条件变量。
  • 否则将TurnstileLock.currentTurnstile放回池中,并将TurnstileLock.currentTurnstile设置为null。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53565301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档