这段代码是否安全? 似乎应该如此,因为永远不会从多个线程分配@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
答案 0 :(得分:11)
您的代码正在使用EventMachine,它仅使用线程进行IO,并在单个线程中执行所有代码处理。 EventMachine完全是出于您的目的而设计的,因此所有变量访问都是设计线程安全的,代码中不需要额外的检查。
分配不仅安全(即使它是原子的),但数据结构的操纵也是安全的,不受竞争条件的限制。
答案 1 :(得分:1)
假设您的代码块的线程创建+评估每次发生的时间不到1秒,是的。否则,它不是线程安全的。
我认为值得一提的是,显然你的榜样是人为的;但是,根据您的实际代码,可能需要为您的目的查看Revactor。它是一个actor框架,它使用轻量级的不可抢占的执行线程。因此,很多常见的线程安全问题都会消失,因为没有两个actor可以同时运行。
只是一个想法。
答案 2 :(得分:1)
但我是否需要担心第二个区块正在尝试阅读@myvar的情况?
不,Ruby中的赋值是原子的。