2010-07-07 107 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