这是你如何避免竞争条件?
-module(b).
-export([my_spawn/1]).
my_spawn(Func) ->
Pid = spawn(listener()),
Pid ! {self(), spawn, Func},
receive
{From, Desired_Pid} -> Desired_Pid
end.
listener() ->
receive
{From, spawn, Func} ->
{Pid,Ref} = spawn_monitor(Func),
From ! {self(), Pid},
receive
{'DOWN',Ref, process, _, _} -> io:format("I lived for [calculated how long i lived]")
end
end.
我想在这里实现的是
A = spawn(proc),
monitor(process,A).
然而,A可能会在第二行执行之前死亡。
答案 0 :(得分:3)
如果您生成一个进程并且在创建监视器之前它已经死亡,您仍会收到DOWN
消息:
1> Pid = spawn(erlang,now,[]).
<0.35.0>
2> is_process_alive(Pid).
false
3> monitor(process, Pid).
#Ref<0.0.0.86>
4> flush().
Shell got {'DOWN',#Ref<0.0.0.86>,process,<0.35.0>,noproc}
正如这个shell会话所示,我们首先产生一个故意短暂的进程,我们使用is_process_alive
来验证它已经死了。然后我们为进程创建一个监视器,然后我们刷新shell的消息队列,看看它确实收到了已经死亡的进程的DOWN
消息。