2010-07-07 104 views
5

我想執行的一些方法與紅寶石的原子,根據http://en.wikipedia.org/wiki/Atomicity_(database_systems)寫一個原子操作

舉例來說,如果我有:

a = 30 
b = 75 

我希望能夠做一些事情,如:

atomic_operation do 
    a += 10 
    b -= 39 
end 

Ruby 1.9中是否有一個允許這樣的進程的本地模塊?如果可能的話,我想這樣做,而不使用插件。非常感謝!

+0

在https://github.com/headius/ruby-atomic和內部http://pragprog.com/book/jsthreads/working-with-ruby-看看線程 – 2014-03-22 14:02:32

回答

7

這實際上取決於你對作業的正確工具感興趣的範圍。如果您希望對數據庫執行原子操作,那麼數據庫驅動程序可能(如果它有任何好處/數據庫支持它)提供了一種使用數據庫事務來更新原子的方法。

如果您正在討論嘗試更新共享資源的多線程Ruby應用程序原子和線程安全,那麼Ruby提供了Mutex和ConditionVariable類來幫助您解決這個問題。 (更多信息:http://ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html

+0

還可以查看作爲Ruby標準庫一部分的'Monitor'和'MonitorMixin'類。對於STM來說,需要 – 2010-07-10 11:40:28

4

當你指向一篇關於數據庫的文章時,我猜你在問這個問題。

如果您使用的是Rails,請使用ActiveRecordtransactionmethods

Account.transaction do 
    @alice.withdraw!(100) 
    @bob.deposit!(100) 
end 

如果在Rails之外使用,則必須使用數據庫驅動程序庫提供的內容。檢查Rails上的implementation of transaction以瞭解如何完成此操作。

2

你需要我的朋友是一個軟件事務內存。嘗試一下我在JRuby中玩過的STM實現(你需要簽署回購代碼,因爲我沒有將它打包發佈)。

還檢查出Ruby原子我正在對http://github.com/saivenkat/ruby-atomic工作。在MRI上爲您提供CAS類型的操作。這有點低,但會幫助你解決同樣的問題。我沒有寫MRI的交易內存,但與CAS的基礎設施,它不會很長:)

P.S Stackoverflow不讓我發佈多個鏈接,因爲我沒有使用它的系統很多。因此,在結帳的Codehaus的多元宇宙網站STM JRuby中

--Sai Venkat

+0

+1。儘管沒有嘗試過圖書館。 – 2010-07-10 04:19:07

6

Mutex類可在1.9運行時(和require('thread') 1.8),並允許您在上下文鎖定操作。

# Typically defined in the object initializer 
@lock = Mutex.new 

# Then in your code 
@lock.synchronize do 
    a += 10 
    b -= 39 
end 

這將保證給予互斥#同步的塊順序運行。

官方文檔是在這裏:http://rubydoc.info/stdlib/core/1.9.2/Mutex

+0

最新文檔在這裏:https://ruby-doc.org/core-2.4.1/Thread/Mutex.html – ronen 2017-06-19 15:38:04