以下代碼片段是由Francesco Cesarini和Simon Thompson,Erlang Programming撰寫的第112頁,作爲Erlang可能的競爭條件的一個例證。避免競爭條件
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運行「不確定」部分,可能無法完成,因爲過程2使其被搶佔。過程2然後會運行「未定義」部分來完成。現在,當進程1恢復時,進程2已經註冊了db_server,導致其調用register()以引發運行時錯誤。我希望你能理解我的意思,因爲我不想把這本書的文本去掉。
我的問題是如何編碼上述確切功能以避免當兩個進程同時執行start()時潛在的競爭條件?
我知道OTP爲這些類型的問題提供強大的解決方案,但我對非OTP「設計模式」感興趣。感謝您的迴應。 – Max 2010-12-06 16:31:41