2016-07-11 101 views
0
沒有發生

計劃:互斥在Ruby中

def inc(n) 
    n + 1 
end 

sum = 0 
threads = (1..10).map do 
    Thread.new do 
     10_000.times do 
      sum = inc(sum) 
     end 
    end 
end 
threads.each(&:join) 
p sum 

輸出:

$ ruby MutualExclusion.rb 
100000 
$ 

我預計上述程序的輸出小於100,000。因爲,上面的程序創建了10個線程,並且每個線程 都將共享變量'sum'更新爲10,000次。但在程序執行期間,互斥將肯定會發生。因爲, 互斥在這裏沒有處理。所以我預計不到10萬個輸出。但它的產量恰好爲100,000。 是怎麼發生的?誰在這裏處理互斥問題?我如何實驗這個問題(ME)。

+0

你在MRI或JRuby中測試你的代碼? – spickermann

+0

@spickermann不,我是一個新手。而我並沒有意識到這一點。 – mrg

+0

@spickermann that said,MRI :) – mudasobwa

回答

0

Ruby(MRI)的默認解釋器不會並行執行線程。全球口譯員鎖(GIL)是防止你的競爭條件引入偶然的意外行爲的機制。

您可以瞭解更多有關這一點,包括一個非常類似的示威,在這裏:http://www.jstorimer.com/blogs/workingwithcode/8085491-nobody-understands-the-gil

+0

只是我有了錯誤。你認爲這是對的嗎?因爲不是正確處理互斥,可以完全設置屬性,例如「只有一個線程可以在任何時候執行Ruby代碼」。由此,避免了線程的並行執行。這破壞了線程的主要用途。你怎麼看待這件事。紅寶石的優點還是缺點? – mrg

+0

@mrg不一定;這取決於你在做什麼。特別是在構建Web服務時,您將要執行大量IO(例如API請求);線程調度程序可以在IO在後臺執行時暫停,同時處理其他請求。但對於CPU綁定任務,建議使用另一個解釋器(rbx/rubinius相當不錯)。 – coreyward

+0

那麼我應該採取核磁共振對網絡服務有好處,而rbx對於cpu-bound任務是有好處的? – mrg