Ich möchte in Ruby ein Thread-sicheres Skript ausführen, das ein externes Programm aufruft und dann den Exit-Status dieses externen Programms überprüft. Was ist der beste Weg, es zu tun? Bis jetzt habe ich $?
überprüft, aber ich denke, dass ich mit anderen Teilen des Programms eine Wettlaufbedingung bekomme.
Hier ist ein Beispielcode:
%Vor%Im Idealfall würde ich etwas wie
tun %Vor%, sodass exitstatus
untrennbar mit diesem Prozess verbunden war und nicht mit dem letzten Vorgang. Gibt es eine Möglichkeit, dies zu tun?
Obwohl rb_last_status (aka $?
) eine globale Variable ist, macht Ruby einen magischen Trick, um es pro-Thread zu machen: In rb_thread_save_context
speichert es rb_last_status
in der alten Thread-Struktur; rb_thread_restore_context
setzt rb_last_status
auf den gespeicherten Wert. Wenn Sie eine Race-Bedingung mit $?
haben, ist es ein Ruby-Bug.
Tags und Links ruby thread-safety