避免 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 已死进程的消息。