2013-08-23 27 views
0

這是一個非常基本的併發問題。Ruby變量的Threadsafety?

在Ruby中,是安全的假設,存儲在本地變量的任何狀態是線程安全的?

具體來說,我想在一個Rails應用程序的請求。如果我要在User類中存儲狀態,我認爲這會要求併發問題。但是,如果我實例化一個用戶(例如,請求在設計current_user方法,假設方法不使用一個全球性的引擎罩下自己的狀態),我從來沒有給該用戶指定一個全局變量或常量,我應該能夠修改該實例的狀態而不關心線程安全性,對嗎?

+0

我不確定是否應該指定一個Ruby實現;我知道他們支持多線程...... –

回答

1

基本上,你是對的,單個請求裏,你可以放心地使用任何局部變量,除非你自己產卵的線程。

此外,如果你使用像麒麟服務器使用爲你「線程」處理請求工人(獨立進程)的每個進程住在自己的內存空間,只有一個請求是在同一時間被處理。如果你有一個像彪馬可以處理一個Ruby進程內並行的多個請求線程的服務器可能會出現

問題。這是競態條件可能會開始,如果你有一個像代碼:

class User 
    delf.self.current_user 
    @@current_user 
    end 
end 

User.current_user.destroy 

@@current_user變量可以通過並行處理得到改變,你可以不小心破壞錯誤的用戶。

+0

即使你給的例子在多進程(而不是多線程)模型中也是安全的,對嗎? –

+0

是的,這是正確的 –