ruby中的线程安全外部进程,以及检查exitstatus

时间:2010-01-29 20:21:49

标签: ruby thread-safety

我想在Ruby中运行一个线程安全的脚本来调用外部程序,然后检查该外部程序的退出状态。最好的方法是什么?到目前为止,我一直在检查$?,但我认为我正在与该计划的其他部分达成竞争条件。

以下是一些示例代码:

Thread.new do
  `external_program`
  if $?.exitstatus == 0
    # it worked.
  else
    # it didn't work.
  end
end

理想情况下,我会做类似

的事情
Process.new(`external_program`).exitstatus

以便exitstatus 进程密不可分,而不是最后一个完成的进程。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:17)

虽然rb_last_status(又名$?)是一个全局变量,但是Ruby为每个线程做了一个神奇的技巧:在rb_thread_save_context中,它将rb_last_status存储在旧线程的结构中; rb_thread_restore_context从保存的值中设置rb_last_status。如果你有一个涉及$?的竞争条件,那就是一个Ruby bug。