2011-03-29 71 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