次のコードスニペットはErlangの可能な競合状態の例としてFrancesco CesariniとSimon Thompson、Erlang Programmingによる本の第112ページに記載されています。逐語的な詳細をコピーせずに競合状態の回避
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.
は、著者らは2つのプロセスが同時にスタートを()を実行した場合、プロセス2は、それが先取りされますので、その後、可能性があります完了していない「未定義」セクションを実行している1を処理することを説明します。プロセス2は、「未定義」セクションを完了まで実行する。プロセス1が再開すると、db_serverはすでにプロセス2によって登録されているため、register()への呼び出しによって実行時エラーが発生します。私はあなたが本のテキストをはがしたくないので、私が何を意味するのかを理解することを願っています。
私の質問は、2つのプロセスが同時にstart()を実行すると、潜在的な競合状態を避けるために、上記の正確な機能をコード化する方法はありますか?
2台のサーバーを起動します。私はもともと、O'Reillyの本の例を使っていました。なぜなら、人々が理解しやすく、それで私の質問に答える方が簡単だと思ったからです。フェールオーバーを提供するために、正確に2台のサーバー(プライマリとバックアップ)を起動したいと考えています。私はあなたの提案に似たコードを持っていますが、おそらくあなたのレースの状況を避ける方が良いでしょう。 – Max