此代码可以多次打印“退出”,如您所料:
def print_and_exit
puts "Exiting"
exit
end
Array.new(100) { Thread.new { sleep 1; print_and_exit } }.each(&:join)
但即使用互斥锁保护它,行为也是一样的:
def print_and_exit
puts "Exiting"
exit
end
mutex = Mutex.new
Array.new(100) { Thread.new { sleep 1; mutex.lock; print_and_exit } }.each(&:join)
所以似乎 exit
之后的被调用(并且mutex被清理了),但之前实际上退出了该进程,其他线程继续运行。如何防止这种情况?
exit
的接收者所致。 Thread.main.exit
mutex.synchronize