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

Pet*_*ter 9 ruby thread-safety

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

这是一些示例代码:

Thread.new do
  `external_program`
  if $?.exitstatus == 0
    # it worked.
  else
    # it didn't work.
  end
end
Run Code Online (Sandbox Code Playgroud)

理想情况下,我会做类似的事情

Process.new(`external_program`).exitstatus
Run Code Online (Sandbox Code Playgroud)

所以它与这个过程exitstatus密不可分,而不是最后一个完成的过程.有没有办法做到这一点?

Way*_*rad 17

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