Ruby信号量?

时间:2011-03-29 20:54:04

标签: ruby mutex semaphore

我正在研究Ruby中“Fair Barbershop”问题的实现。这是一个课堂作业,但我不是在寻找任何讲义。我一直在寻找疯狂,但我似乎无法找到一个与C语言相似的信号量的Ruby实现。

我知道有Mutex,这很棒。单一实现,确实完成了那种信号量应该做的事情。

然后是条件变量。我认为这样做会很好,但是看看这些,他们需要一个Mutex用于每次等待调用,这对我来说就像我不能将数值放到信号量上(因为我有七个理发店,3理发师等。)。

我认为我需要一个Counting Semaphore,但我认为Ruby(我能找到的)在其核心中包含这样一个类有点奇怪。任何人都可以帮助我指出正确的方向吗?

6 个答案:

答案 0 :(得分:4)

如果您使用的是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

答案 1 :(得分:2)

http://sysvipc.rubyforge.org/SysVIPC.html给你SysV信号量。 Ruby非常适合消除Sys​​V信号量的API瑕疵,而SysV信号量是最好的 - 它们是进程间信号量,你可以使用SEM_UNDO,这样即使SIGKILL也不会搞砸你的全局状态(POSIX进程间信号量不会超过#39)你有SysV信号量,你可以同时对几个信号量进行原子操作,只要它们在同一个信号量集中。

对于线程间信号量,那些应该可以使用Condition Variables和Mutexes完全模拟。 (参见Bernanrdo Martinez关于如何做到的链接。)

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

感谢@ x3ro的链接。这指向了我正确的方向。但是,Fukumoto给出的实现(至少对于rb1.9.2)Thread.critical不可用。此外,我尝试用Thread.exclusive {}替换Thread.critical调用只会导致死锁。事实证明,Ruby的一个提议的Semaphore补丁(我已在下面链接)通过用一个其他一些调整替换Thread.exclusive {}和Mutex :: synchronize {}来解决问题。感谢@ x3ro让我朝着正确的方向前进。

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

答案 4 :(得分:0)

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

https://gist.github.com/3439373

答案 5 :(得分:0)

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