Ruby:如何在运行object.method的线程之间共享全局变量
我正在运行一个ruby脚本,它创建了几个线程 我想让线程能够访问一个公共变量,让主线程知道何时加入线程 我试图使用$global变量来实现这一点,但是线程似乎无法访问$globalRuby:如何在运行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
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。