在Ruby线程子类中,在超级块内部和外部分配变量有什么区别?

在Ruby线程子类中,在超级块内部和外部分配变量有什么区别?,ruby,multithreading,Ruby,Multithreading,如果我有这样的课 class CustomThread < Thread def initialize @outside = [] super do @inside = [] end end def push(value) @outside.push(value) @inside.push(value) end end class CustomThread

如果我有这样的课

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

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

@外部
@内部
的行为有什么区别?如何确定在超级块外部和内部分配哪些变量?

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

因此,不同之处在于,当创建
自定义线程时,
@外部
被分配,而
@内部
在线程运行后的某个点被分配。这是一个竞赛条件:

CustomThread.new.push_value 0
因为
@inside
可能没有在
推送值尝试推送到它时分配。为了安全地使用它,您必须

thread = CustomThread.new
thread.join
thread.push_value 0

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

因此,不同之处在于,当创建
自定义线程时,
@外部
被分配,而
@内部
在线程运行后的某个点被分配。这是一个竞赛条件:

CustomThread.new.push_value 0
因为
@inside
可能没有在
推送值尝试推送到它时分配。为了安全地使用它,您必须

thread = CustomThread.new
thread.join
thread.push_value 0