以下代码片段是由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