在erlang中避免竞争条件

时间:2015-02-27 19:01:13

标签: erlang race-condition

这是你如何避免竞争条件?

-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可能会在第二行执行之前死亡。

1 个答案:

答案 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消息。