繁体   English   中英

这个ruby代码线程安全吗?

[英]Is this ruby code thread safe?

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

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

赋值不仅安全(即使它是原子的),但数据结构的操作也是安全的,不受竞争条件的影响。

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

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

只是一个想法。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM