【问题标题】:Ruby Semaphores?红宝石信号量?
【发布时间】:2011-07-25 15:03:52
【问题描述】:

我正在用 Ruby 实现“公平理发店”问题。这是课堂作业,但我不是在寻找任何讲义。我一直在疯狂地搜索,但似乎找不到与 C 中的信号量相同的信号量的 Ruby 实现。

我知道有 Mutex,这很棒。单一实现,正是这种信号量应该做的事情。

然后是条件变量。我认为这会很好,但是看看这些,每次等待调用都需要一个 Mutex,在我看来,我无法将数值输入信号量(例如,我有 7 家理发店,3理发师等)。

我认为我需要一个计数信号量,但我认为 Ruby(据我所知)在其核心中不包含这样的类有点奇怪。谁能帮我指出正确的方向?

【问题讨论】:

  • 经过一些调整,这似乎正是我想要的。 Thread.critical 的东西显然在 1.9 中不起作用,所以我用 Thread.exclusive {} 块替换了它。不过,我仍然不明白为什么这不是 Ruby 核心库的一部分。
  • imasy.or.jp 的服务器似乎已关闭或关闭...有人有更新的链接吗?

标签: ruby mutex semaphore


【解决方案1】:

如果您使用的是 JRuby,您可以从 Java 导入信号量,如 this article 所示。

require 'java'

java_import 'java.util.concurrent.Semaphore'

SEM = Semaphore.new(limit_of_simultaneous_threads)
SEM.acquire #To decrement the number available
SEM.release #To increment the number available

【讨论】:

    【解决方案2】:

    http://sysvipc.rubyforge.org/SysVIPC.html 为您提供 SysV 信号量。 Ruby 非常适合消除 SysV 信号量的 API 缺陷,而 SysV 信号量是最好的——它们是进程间信号量,您可以使用 SEM_UNDO,这样即使 SIGKILL 也不会弄乱您的全局状态(POSIX 进程间信号量没有这个),并且您使用 SysV 信号量可以一次对多个信号量执行原子操作,只要它们在同一个信号量集中。

    至于线程间信号量,它们应该可以用条件变量和互斥体完美地模拟。 (请参阅 Bernanrdo Martinez 的链接了解如何完成)。

    【讨论】:

      【解决方案3】:

      我还发现了这段代码: https://gist.github.com/pettyjamesm/3746457

      可能有人会喜欢这个其他选项。

      【讨论】:

        【解决方案4】:

        因为 concurrent-ruby 是稳定的(超过 1.0)并且被广泛使用,因此最好的(并且可以跨 Ruby 实现移植)解决方案是使用它的 Concurrent::Semaphore

        【讨论】:

          【解决方案5】:

          感谢@x3ro 提供的链接。这为我指明了正确的方向。但是,对于 Fukumoto 提供的实现(至少对于 rb1.9.2),Thread.critical 不可用。此外,我尝试用 Thread.exclusive{} 替换 Thread.critical 调用只会导致死锁。事实证明,有一个提议的 Ruby 信号量补丁(我在下面链接)通过用 Mutex::synchronize{} 替换 Thread.exclusive{} 解决了这个问题,以及其他一些调整。感谢@x3ro 将我推向正确的方向。

          http://redmine.ruby-lang.org/attachments/1109/final-semaphore.patch

          【讨论】:

          • 当我尝试访问该页面时,我收到一个未经授权的错误。
          【解决方案6】:

          由于这里的其他链接对我不起作用,我决定快速破解一些东西。我没有对此进行测试,因此欢迎输入和更正。它只是基于互斥量是二进制信号量的想法,因此信号量是一组互斥量。

          https://gist.github.com/3439373

          【讨论】:

            猜你喜欢
            • 2017-04-01
            • 1970-01-01
            • 2019-08-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-09
            • 2011-07-06
            • 1970-01-01
            相关资源
            最近更新 更多