如何保护某些代码不受SIG使用线程/互斥终止的影响



我在无尽循环中进行了一些重要的计算,不希望这种计算中断SIGINT信号(例如ctrl-c)。所以我把循环放在线程中,用互斥锁保护重要的计算:

mutex = Mutex.new
trap('INT') do
  Thread.new do
    puts 'Terminating..'
    exit(0)
  end.join
end
Thread.new do
  loop do
    mutex.synchronize do
      puts 'Some important computation is started.'
      sleep(5)
      puts 'Some important computation is done.'
    end
    sleep(30)
  end
end.join

我在trap块中添加了另一个线程,所以我希望只有当互斥锁被解锁时,这个线程才会被执行。

但事实上,第二个线程在接收到SIGINT信号后立即启动:

Some important computation is started.
^CTerminating..

我错过了什么/做错了什么?

您必须将陷阱线程与计算同步:

  trap('INT') do
    Thread.new do
       mutex.synchronize do
          puts 'Terminating..'
          exit(0)
       end  
    end.join
  end

但是,如果在trap函数中设置一个布尔var,并使用它来打破循环,也许会更容易。

mustexit = false
trap('INT') do
  mustexit= true
end
Thread.new do
loop do    
  puts 'Some important computation is started.'
  sleep(5)
  puts 'Some important computation is done.'
  if mustexit then
     break
  end
end
sleep(30)
end.join

最新更新