我碰巧读到一个spawn_opt
叫做monitor
:http ://www.erlang.org/doc/man/erlang.html#spawn_opt-2
但是当我使用它时,我得到了这个:
1> gen_server:start(some_module, [], [{spawn_opt, [monitor]}]).
** exception error: bad argument
in function proc_lib:check_for_monitor/1 (proc_lib.erl, line 182)
in call from proc_lib:spawn_opt/4 (proc_lib.erl, line 161)
in call from proc_lib:start_link/5 (proc_lib.erl, line 317)
2>
这就是 OTP 的 proc_lib.erl 中第 182 行周围发生的情况:
%% OTP-6345
%% monitor spawn_opt option is currently not possible to use
check_for_monitor(SpawnOpts) ->
case lists:member(monitor, SpawnOpts) of
true ->
erlang:error(badarg);
false ->
false
end.
该monitor
选项被故意禁用,但我不明白为什么。我搜索了一下OTP-6345
,原来它来自发行说明,我也找不到足够的信息:http ://www.erlang.org/download/otp_src_R11B-3.readme
我们一直手动执行 spawn-then-monitor 步骤,没有任何问题,但为什么 OTP 代码选择完全忽略该monitor
选项?是否存在潜在的竞争条件或任何其他陷阱?