我正在用Ruby实现“公平理发店”的问题。这是一个课堂作业,但我不想要任何讲义。我一直在疯狂地寻找,但我似乎找不到一个能反映C语言中的信号量的Ruby实现。
我知道有Mutex,这很棒。单一的实现,做的正是这种信号量应该做的事情。
然后是条件变量。我认为这会很有效,但看看这些,他们要求每个等待调用一个互斥,在我看来,我不能把数字的信号量(例如,我有7个理发店,3个理发店,等等)。
我想我需要一个Counting Semaphore,但我觉得Ruby (根据我所能找到的)没有在它的核心中包含这样的类,这有点奇怪。有人能帮我指出正确的方向吗?
发布于 2011-03-30 11:17:24
感谢@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
发布于 2013-09-27 18:52:12
如果您使用的是JRuby,则可以像this article中所示那样从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发布于 2015-05-12 06:30:59
有一个http://sysvipc.rubyforge.org/SysVIPC.html,它提供了SysV信号量。Ruby是消除SysV信号量的API缺陷的完美工具,而SysV信号量是最好的--它们是进程间信号量,您可以使用SEM_UNDO,这样即使是SIGKILL也不会弄乱您的全局状态(POSIX进程间信号量没有这一点),并且您可以使用SysV信号量一次对多个信号量执行原子操作,只要它们在同一个信号量集中。
至于线程间信号量,它们应该完全可以用条件变量和Mutexes来模拟。(请参阅Bernanrdo Martinez的链接了解如何做到这一点)。
https://stackoverflow.com/questions/5478789
复制相似问题