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.