2

这段代码是线程安全的吗?看起来应该是这样,因为@myvar 永远不会从多个线程中分配(假设块在 < 1 秒内完成)。

但是我是否需要担心第二个块在写入时试图读取@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
4

3 回答 3

11

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

分配不仅是安全的(即使它是原子的),而且数据结构的操作也是安全的,并且不受竞争条件的影响。

于 2010-06-21T22:42:47.147 回答
1

但是我是否需要担心第二个块在写入时试图读取@myvar 的情况?

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

于 2010-05-28T06:39:45.840 回答
1

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

我认为值得一提的是,显然您的示例是人为的。但是,根据您的实际代码,可能值得出于您的目的检查Revactor。它是一个参与者框架,它使用轻量级的不可抢占的执行线程。结果,许多常见的线程安全问题确实被忽略了,因为没有两个参与者可以同时运行。

只是一个想法。

于 2010-05-28T03:19:45.847 回答