【发布时间】:2015-11-06 14:18:44
【问题描述】:
在Programming Erlang: Software for a Concurrent World一书的第 13 章末尾,我们得到了一段代码:
keep_alive(Name, Fun) ->
register(Name, Pid = spawn(Fun)),
on_exit(Pid, fun(_Why) -> keep_alive(Name, Fun) end).
书上说:
- 进程
Pid可能在on_exit执行之前终止。 - 如果两个程序尝试同时评估
keep_alive并使用相同的Name值,则代码可能会发生竞争条件。
如果两个程序同时使用相同的Name 调用keep_alive,那么其中一个register 调用将触发badarg 异常,因为名称已被占用,调用进程将终止。
所以,不是进程 Pid 在调用 on_exit 之前死亡,而是 调用 on_exit 的进程死亡
作者在这里以此为例来描述竞态条件的意义何在?
【问题讨论】:
标签: erlang race-condition