当两个进程同时调用 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
错误。我没有看过这个函数的实现,但我想它是这样工作的。
在任何情况下,您永远不会在同一个名称下注册两个进程。注册是原子的。一个注册调用将成功,一个将失败。
可在此处获取更多信息:
当 运行 的两个不同进程同时调用同一微秒时会发生什么(无论 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
错误。我没有看过这个函数的实现,但我想它是这样工作的。
在任何情况下,您永远不会在同一个名称下注册两个进程。注册是原子的。一个注册调用将成功,一个将失败。
可在此处获取更多信息: