避免 erlang 中的竞争条件
Avoiding a race condition in erlang
这是你避免竞争条件的方式吗?
-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可能在第二行执行之前就死了。
如果您生成一个进程并且它在您创建监视器之前终止,您仍然会收到 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
已死进程的消息。
这是你避免竞争条件的方式吗?
-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可能在第二行执行之前就死了。
如果您生成一个进程并且它在您创建监视器之前终止,您仍然会收到 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
已死进程的消息。