【发布时间】:2010-12-07 18:22:59
【问题描述】:
以下代码 sn-p 取自 Erlang 编程的 Francesco Cesarini 和 Simon Thompson 的书的第 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 恢复时,db_server 已经被进程 2 注册,导致其对 register() 的调用引发运行时错误。我希望你能明白我的意思,因为我不想盗用这本书的文字。
我的问题是,当两个进程同时执行 start() 时,如何对上述 exact 功能进行编码以避免潜在的竞争条件?
【问题讨论】:
标签: erlang