3

假设 aPid注册如下。

register(foobar, Pid).

现在我想替换关联的 pid:

unregister(foobar),
register(foobar, NewPid).

我怎样才能以原子方式实现这一目标?

4

2 回答 2

1

使用gprochttps://github.com/uwiger/gproc

优点是它的注册表是一个 ETS 表,ETS 表具有原子更新,您可以像您想要的那样原子地覆盖名称。我几乎肯定它可以做这种事情。

于 2012-10-04T13:58:30.080 回答
0

我不认为这是可能的,至少,使用register/2unregister/1BIFs。您需要序列化对注册表的请求,例如使用 agen_serverETS table.

另外,请考虑以下事项。进程的注册名称是原子原子,在 Erlang VM 中,是有限的,而不是垃圾收集的。如果您正在动态注册/注销进程,则需要大量进程(例如,每个请求一个进程),您可能需要重新考虑这种方法,因为您可能会在某些时候用完原子

于 2012-10-05T07:21:53.317 回答