在Ruby中的出口周围锁定互斥锁

时间:2018-04-02 20:46:21

标签: ruby multithreading mutex

此代码可以多次打印“退出”,如您所料:

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
  • ,则没有任何区别
  • 这是MRI 2.5.0p0

0 个答案:

没有答案