我在无限循环中进行了一些重要的计算,并且不希望这个计算中断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..
我错过了什么/做错了什么?
答案 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