[英]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.