Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 编写原子操作_Ruby_Transactions_Atomic_Ruby 1.9_Atomicity - Fatal编程技术网

Ruby 编写原子操作

Ruby 编写原子操作,ruby,transactions,atomic,ruby-1.9,atomicity,Ruby,Transactions,Atomic,Ruby 1.9,Atomicity,我想用Ruby执行一些原子性方法,根据 例如,如果我有: a = 30 b = 75 我希望能够做到以下几点: atomic_operation do a += 10 b -= 39 end Ruby 1.9中是否有一个本机模块允许这样的过程?如果可能的话,我想不使用插件就这样做。非常感谢 这实际上取决于您感兴趣的范围,以及适合该工作的工具。如果您希望在数据库上执行原子操作,那么数据库驱动程序可能会(如果它很好/数据库支持它)提供一种使用数据库事务使更新原子化的方法 如果您谈论的是一

我想用Ruby执行一些原子性方法,根据

例如,如果我有:

a = 30
b = 75
我希望能够做到以下几点:

atomic_operation do
  a += 10
  b -= 39
end

Ruby 1.9中是否有一个本机模块允许这样的过程?如果可能的话,我想不使用插件就这样做。非常感谢

这实际上取决于您感兴趣的范围,以及适合该工作的工具。如果您希望在数据库上执行原子操作,那么数据库驱动程序可能会(如果它很好/数据库支持它)提供一种使用数据库事务使更新原子化的方法

如果您谈论的是一个多线程Ruby应用程序,它试图对共享资源进行原子和线程安全的更新,那么Ruby提供了互斥和条件变量类来帮助您解决这一问题。
(更多信息:)

当你指着一篇关于数据库的文章时,我猜你是在问这个问题

如果您使用的是Rails,则使用的
事务


如果在Rails之外使用,则必须使用数据库驱动程序库提供的内容。查看Rails,了解如何实现它。

我的朋友,你需要的是软件事务内存。尝试我在JRuby中使用的STM实现(您需要在repo中签出代码,因为我还没有将其打包到发行版中)

还可以查看我正在开发的Ruby atomic。为您提供MRI上的CAS操作类型。这是一个较低的级别,但会帮助您解决相同的问题。我还没有为MRI one编写事务性内存,但使用CAS基础架构不会太长:)

p.S Stackoverflow不允许我发布多个链接,因为我没有经常使用它的系统。因此,在JRuby中的STM中检查codehaus中的多重宇宙站点


--Sai Venkat

你看过“交易简单”的宝石吗

我想那会符合你的目的


互斥类在1.9运行时(和1.8中的
require('thread')
)中可用,并允许您在上下文中锁定操作

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

# Then in your code
@lock.synchronize do
  a += 10
  b -= 39
end
这将保证指定给互斥同步的块按顺序运行


官方文件在这里:

+1,因为STM是OP需要的。不过,我还没有尝试过这个库。还可以查看Ruby标准库中的
Monitor
MonitorMixin
# Typically defined in the object initializer
@lock = Mutex.new

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