Das folgende Codefragment ist Seite 112 des Buches von Francesco Cesarini und Simon Thompson, Erlang Programming, zur Illustration einer möglichen Wettlaufsituation in Erlang entnommen.Vermeiden einer Wettlaufsituation
start() ->
case whereis(db_server) of
undefined ->
Pid = spawn(db_server, init, []),
register(db_server, Pid),
{ok, Pid};
Pid when is_pid(Pid) ->
{error, already_started}
end.
Ohne die Details wörtlich zu kopieren, erklären die Autoren, dass, wenn zwei Prozesse gleichzeitig start() ausführen, dann 1 verarbeiten möglicherweise nicht abgeschlossen, die „undefiniert“ Abschnitt ausgeführt wird, weil Prozess 2 verursacht es vorbelegt werden. Der Prozess 2 würde dann den "undefinierten" Abschnitt zum Abschluss bringen. Jetzt, wenn Prozess 1 fortgesetzt wird, wurde db_server bereits von Prozess 2 registriert, wodurch der Aufruf von register() einen Laufzeitfehler auslöst. Ich hoffe du verstehst was ich meine, weil ich den Text des Buches nicht filtrieren will.
Meine Frage ist, wie kann die obige genaue Funktionalität codiert werden, um die mögliche Race Condition zu vermeiden, wenn zwei Prozesse gleichzeitig starten()?
Ich möchte zwei Server starten. Ich habe ursprünglich das Beispiel aus dem O'Reilly-Buch benutzt, weil ich dachte, es wäre leichter für die Leute zu verstehen und daher meine Frage zu beantworten. Ich möchte genau 2 Server starten (ein primäres und ein Backup), um Failover bereitzustellen. Ich habe einen Code, der dem ähnlich ist, was Sie vorschlagen, aber vielleicht ist Ihr Rennen besser zu vermeiden. – Max