这个ruby代码是线程安全的吗?
这个代码是线程安全的吗?看起来应该是这样,因为@myvar永远不会从多个线程分配(假设块在<1s内完成) 但我是否需要担心第二个块在编写@myvar时试图读取它的情况这个ruby代码是线程安全的吗?,ruby,multithreading,thread-safety,instance-variables,Ruby,Multithreading,Thread Safety,Instance Variables,这个代码是线程安全的吗?看起来应该是这样,因为@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
假设每次在不到1秒的时间内创建并计算代码块的线程,是的。否则,它不是线程安全的 我认为值得一提的是,很明显你的例子是人为的;然而,根据您的实际代码,出于您的目的,它可能值得签出。它是一个actor框架,使用轻量级的不可抢占的执行线程。结果,很多常见的线程安全问题都被忽略了,因为没有两个参与者可以同时运行 只是一个想法 但我是否需要担心第二个块在编写@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
不,Ruby中的赋值是原子的。您的代码正在使用,它只对IO使用线程,并且在单个线程中处理所有代码。EventMachine完全是为您的目的而设计的,因此所有变量访问都是线程安全的,代码中不需要额外的检查
不仅赋值是安全的(即使它是原子的),而且数据结构的操作也是安全的,不受竞争条件的限制。只是出于好奇,有没有赋值不是原子的语言?C/C++对赋值的原子性做出了go保证(实际上通常不是)。奇怪,现在,SO没有提供变体,将问题迁移到何处。也不能取消最后的投票(也许更多的是一个问题)。