Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用信号中断Ruby线程_Ruby_Multithreading_Signals - Fatal编程技术网

用信号中断Ruby线程

用信号中断Ruby线程,ruby,multithreading,signals,Ruby,Multithreading,Signals,我在主线程和工作线程之间拆分了一个程序。我想调用一个中断一切的软件中断,但它似乎只中断主线程 下面是一个简化的概念证明。我定义了一个陷阱,并让另一个线程调用Process.kill来创建中断 Signal.trap("INT") do Thread.new { puts "int 1" sleep 5 puts "int 2" sleep 5 }.join end int_thread = Thread.new { Process.kill("IN

我在主线程和工作线程之间拆分了一个程序。我想调用一个中断一切的软件中断,但它似乎只中断主线程

下面是一个简化的概念证明。我定义了一个陷阱,并让另一个线程调用Process.kill来创建中断

Signal.trap("INT") do 
  Thread.new {
    puts "int 1"
    sleep 5
    puts "int 2"
    sleep 5
  }.join
end

int_thread = Thread.new {
  Process.kill("INT", Process.pid)
}

work_thread = Thread.new {
  puts "work 1"
  sleep 5
  puts "work 2"
  sleep 5  
  puts "work 3"
  sleep 5
}

puts "main 1"
sleep 5
puts "main 2"
sleep 5
puts "main 3"
sleep 5
=>


为什么工作线程不受中断的影响?我做错什么了吗?是否有任何方法可以调用工作线程的中断

当您在主线程中处理信号时,主线程必须处理它,然后继续正常的业务。如果将处理放在工作线程中,它将是处理它的线程。不确定这是否回答了您的问题。我不确定,当我在工作线程中声明陷阱并调用Process.kill时,它仍然只会中断主线程。我认为@ndnenkov认为主线程执行陷阱是正确的。也许这是出于设计,不管你在哪里定义陷阱。
main 1
work 1
int 1 # interrupt called here
work 2 # worker thread still running
int 2
work 3
main 2 # main thread continues after interrupt
main 3