在Ruby Thread子类中为超级块内部和外部分配变量的区别?

时间:2017-10-19 02:37:59

标签: ruby multithreading

如果我有类似

的课程
class CustomThread < Thread
  def initialize
    @outside = []
    super do
      @inside = []
    end
  end

  def push(value)
    @outside.push(value)
    @inside.push(value)
  end
end

@outside@inside的行为有何不同?如何确定在超级块之外分配哪些变量与其内部?

1 个答案:

答案 0 :(得分:0)

super从父类调用相同的方法。因此,您正在调用Thread#initialize并传递一个分配@inside的块。 docs告诉我们这会创建一个执行给定块的新线程。

所以不同之处在于创建@outside时会分配CustomThread,而在线程运行后稍后会在某个时间点分配@inside。所以这是竞争条件:

CustomThread.new.push_value 0

因为在@inside尝试推送push_value时可能尚未分配thread = CustomThread.new thread.join thread.push_value 0 。要安全地使用它,你必须这样做

{{1}}