这个ruby代码是线程安全的吗?

这个ruby代码是线程安全的吗?,ruby,multithreading,thread-safety,instance-variables,Ruby,Multithreading,Thread Safety,Instance Variables,这个代码是线程安全的吗?看起来应该是这样,因为@myvar永远不会从多个线程分配(假设块在

这个代码是线程安全的吗?看起来应该是这样,因为@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

假设每次在不到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没有提供变体,将问题迁移到何处。也不能取消最后的投票(也许更多的是一个问题)。