2011-03-29 72 views
14

我正在研究Ruby中“公平理发店”问题的实现。这是为了一个班级任务,但我没有寻找任何讲义。我一直在寻找像疯了似的,但我似乎无法找到一个Ruby实现,它反映那些C.Ruby信号量?

我知道有互斥发现信号灯的,这是很大的。单一的实现,就是那种信号量应该做的。

然后是条件变量。我认为这样做会很好,但看着这些,他们需要一个Mutex来等待每一次等待,这在我看来就像我不能把数值放到信号量上一样(例如,我有7个理发店,3个理发师等)。

我想我需要一个计数信号,但我认为这是一个有点怪异的是Ruby没有(从我可以找到)包含在其核心这样一类。任何人都可以帮助我指出正确的方向吗?

+2

这个怎么样:HTTP:// WWW .imasy.or.jp /〜fukumoto/ruby​​/semaphore.rb? – fresskoma 2011-03-29 21:10:03

+0

经过一些调整,这看起来正是我所期待的。 Thread.critical的东西显然在1.9中不起作用,所以我用Thread.exclusive {}块替换了它。不过,我仍然不明白为什么这不是Ruby核心库的一部分。 – 2011-03-30 02:33:45

+0

imasy.or.jp的服务器似乎已经消失或关闭......任何人都有更新的链接? – 2012-08-23 15:39:07

回答

0

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

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

+2

当我尝试访问该页面时,出现未授权错误。 – 2012-07-18 20:33:20

+0

我也得到了403 ... – 2012-08-23 15:36:48

0

由于这里的其他链接不为我工作,我决定迅速砍东西一起。我没有测试过,因此欢迎输入和更正。它仅仅基于互斥体是一个二元信号量的思想,因此信号量是一组互斥体。

https://gist.github.com/3439373

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 
2

http://sysvipc.rubyforge.org/SysVIPC.html,让你的SysV信号灯。 Ruby对于消除Sys​​V信号量的API瑕疵是完美的,SysV信号量是最好的 - 它们是进程间信号量,可以使用SEM_UNDO,这样即使SIGKILL也不会混淆你的全局状态(POSIX进程间信号量没有这个),并且使用SysV信号量,只要它们处于相同的信号量集合中,您就可以一次对多个信号量执行原子操作。

至于线程间信号量,这些应该是完美emulatable与条件变量和互斥体。 (请参阅Bernanrdo Martinez关于如何完成的链接)。

0

因为并发红宝石是稳定的(超过1.0)及被广泛使用的这样的最佳(跨红宝石impls及便携式)解决方案是使用其Concurrent::Semaphore