这个ruby代码线程安全吗?

时间:2010-05-28 02:57:51

标签: ruby multithreading thread-safety instance-variables

这段代码是否安全? 似乎应该如此,因为永远不会从多个线程分配@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

3 个答案:

答案 0 :(得分:11)

您的代码正在使用EventMachine,它仅使用线程进行IO,并在单个线程中执行所有代码处理。 EventMachine完全是出于您的目的而设计的,因此所有变量访问都是设计线程安全的,代码中不需要额外的检查。

分配不仅安全(即使它是原子的),但数据结构的操纵也是安全的,不受竞争条件的限制。

答案 1 :(得分:1)

假设您的代码块的线程创建+评估每次发生的时间不到1秒,是的。否则,它不是线程安全的。

我认为值得一提的是,显然你的榜样是人为的;但是,根据您的实际代码,可能需要为您的目的查看Revactor。它是一个actor框架,它使用轻量级的不可抢占的执行线程。因此,很多常见的线程安全问题都会消失,因为没有两个actor可以同时运行。

只是一个想法。

答案 2 :(得分:1)

  

但我是否需要担心第二个区块正在尝试阅读@myvar的情况?

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

相关问题