Ruby:如何在运行object.method的线程之间共享全局变量

Ruby:如何在运行object.method的线程之间共享全局变量,ruby,multithreading,global-variables,Ruby,Multithreading,Global Variables,我正在运行一个ruby脚本,它创建了几个线程 我想让线程能够访问一个公共变量,让主线程知道何时加入线程 我试图使用$global变量来实现这一点,但是线程似乎无法访问$global class IO_ def change(number) sleep(60 * number) $trade_executed = true end end io = IO_.new numbers = 1, 2 $threads = {} $trade_executed = fals

我正在运行一个ruby脚本,它创建了几个线程

我想让线程能够访问一个公共变量,让主线程知道何时加入线程

我试图使用$global变量来实现这一点,但是线程似乎无法访问$global

class IO_ 
  def change(number)
    sleep(60 * number)
    $trade_executed = true
  end
end 

io = IO_.new 
numbers = 1, 2
$threads = {}
$trade_executed = false

def start_threads(numbers)
  numbers.each do |number|
    $threads[number] = Thread.new {io.change(number)}
  end
end

start_threads(numbers)

while true
  p $trade_executed
  p $threads
  sleep(10)
end
执行的上述$trade_将始终为“false”


但是如果我将方法更改移到io对象之外,它就会工作。

问题在于函数start\u线程。您在该函数中调用了io.changenumber,但该函数中未定义局部变量io。结果是两个线程都因NameError而死亡

您可以将“开始线程”功能更改为:

def start_threads(numbers, io)
  numbers.each do |number|
    $threads[number] = Thread.new {io.change(number)}
  end
end
这样称呼它:

start_threads(numbers, io)

非常感谢。需要传递对象。明白了。Re,一个…变量,让主线程知道何时加入。。。为什么主线程需要知道何时加入?在那一刻之前,它将继续做什么?通常情况下,线程A在线程B完成之前,当线程A不能做任何其他事情时,就会连接线程B。