当两个进程同时调用 register() 时会发生什么

What happens when two processes both call register() at the same time

当 运行 的两个不同进程同时调用同一微秒时会发生什么(无论 CPU 的最小单位是什么)

register(proc, spawn( ... ) )

这是否在同一个原子上注册了两个进程?

如果上述问题的答案是肯定的,那么请看下面的代码:

start(Atom, Fun) when is_atom(Atom), is_function(Fun, 0) ->
Sender = self(),
Fun2 = fun() ->
       case catch register(Atom, self()) of
           true ->
           Sender ! {started, self()},
           Fun();
           _ ->
           Sender ! {already_running, self()}
       end
   end,
Pid = spawn(Fun2),
receive
{started, Pid} ->
    {ok, Pid};
{already_running, Pid} ->
    already_running
end.

如果两个进程同时调用上面的代码,都会收到 {Ok, Pid}

只能使用给定名称(atom)注册一个进程。调用 register/2 的第二个进程将失败并引发 badarg 错误。

至于当两个进程同时调用 register/2 时会发生什么,我想 Erlang 在内存中保存了 table 个注册进程。当 register/2 被调用时, table 被锁定,新进程被注册。如果两个进程同时调用 register/2,一个进程必须等到另一个进程完成 register/2 调用。一旦注册表锁被释放,第二个进程将能够注册,但该名称已经在注册表中,因此该调用将引发 badarg 错误。我没有看过这个函数的实现,但我想它是这样工作的。

在任何情况下,您永远不会在同一个名称下注册两个进程。注册是原子的。一个注册调用将成功,一个将失败。

可在此处获取更多信息: