2010-05-28 105 views
2

此代碼是線程安全嗎?它似乎像它應該是因爲@myvar將永遠不會從多個線程分配(假設塊在< 1s完成)。這是紅寶石代碼線程安全嗎?

但是我是否需要擔心第二個塊在寫入時正在嘗試讀取@myvar的情況?

require 'rubygems' 
require 'eventmachine' 

@myvar = Time.now.to_i 

EventMachine.run do 

    EventMachine.add_periodic_timer(1) do 
    EventMachine.defer do 
     @myvar = Time.now.to_i # some calculation and reassign 
    end 
    end 

    EventMachine.add_periodic_timer(0.5) do 
    puts @myvar 
    end 

end 
+0

奇怪,現在SO不提供變體,在哪裏遷移問題。無法取消近距離投票( – Nakilon 2012-11-22 13:16:41

+0

更多http://codereview.stackexchange.com/問題也許。 – Orbling 2012-11-22 16:27:59

回答

1

但是我是否需要擔心第二個塊在寫入時正在嘗試讀取@myvar的情況?

不,Ruby中的賦值是原子的。

+2

只是出於好奇,是否有語言的任務不是原子? – 2010-05-29 17:14:46

+0

C/C++使得保證有關任務的原子性(實際上通常不是)。 – 2015-04-20 00:57:38

1

假設您的代碼塊的線程創建+評估發生在每次不到1秒內,是的。否則,它不是線程安全的。

我認爲值得一提的一件事是,顯然你的例子是人爲的;但是,根據您的實際代碼,可能需要檢查Revactor用於您的目的。這是一個演員框架,它使用輕量級的非搶佔式執行線程。因此,很多常見的線程安全問題都沒有出現,因爲沒有兩個actor可以同時運行。

只是一個想法。

11

您的代碼使用的是EventMachine,它僅使用線程來處理IO,並在單個線程中處理所有代碼。 EventMachine完全是爲您的目的而設計的,所以所有變量訪問都是按設計線程安全的,不需要額外的代碼檢查。

不僅分配安全(即使它是原子的),但數據結構的操作也是安全的,不受競爭條件的限制。