Следующий фрагмент кода взят на странице 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.
Не копируя дословно подробности, авторы объясняют, что если два процесса одновременно выполняют start (), то процесс 1, выполняющий секцию «undefined», может не завершиться, поскольку процесс 2 приводит к его прерыванию. Процесс 2 затем запустит раздел «неопределенный» до завершения. Теперь, когда процесс 1 возобновляется, db_server уже был зарегистрирован процессом 2, в результате чего его вызов register () выдает ошибку времени выполнения. Надеюсь, вы понимаете, о чем я, потому что я не хочу вставлять текст книги.
Мой вопрос: как можно кодировать вышеуказанную точную функциональность, чтобы избежать возможного состояния гонки, когда два процесса одновременно выполняют start ()?