如何保护SIG终止线程/互斥锁的代码?

时间:2014-09-30 19:06:24

标签: ruby multithreading mutex

我在无限循环中进行了一些重要的计算,并且不希望这个计算中断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

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

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

Some important computation is started.
^CTerminating..

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

1 个答案:

答案 0 :(得分:1)

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

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

但是如果你在陷阱函数中设置一个boolean 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