Ruby信号量?

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

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

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

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

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

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 

有http://sysvipc.rubyforge.org/SysVIPC.html ,它为您提供SysV信号量。 Ruby非常适合消除Sys​​V信号量的API瑕疵,而SysV信号量是最好的 – 它们是进程间信号量,你可以使用SEM_UNDO,这样即使SIGKILL也不会搞乱你的全局状态(POSIX进程间信号量没有这个),并且您使用SysV信号量,只要它们位于相同的信号量集中,您就可以同时对多个信号量执行primefaces操作。

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

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

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

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

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

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

https://gist.github.com/3439373

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