0

(也可以在Erlang 的邮件列表中找到。)

是否可以编写一个函数,等待 Erlang 节点上运行的每个进程到达阻塞点,等待消息?

仅当每个进程都在等待尚未发送给它的消息时,该函数才应返回。假设没有进程处于与时间相关的暂停状态(使用 after 子句接收、与计时器相关的操作等)。当然,运行此功能的进程被排除在外。

显然是错误的答案:

erlang:yield/0:这给了所有其他进程运行的机会,但在它被阻塞之前不一定。

4

1 回答 1

0

不是 100% 正确的方法:

only_one_not_waiting() ->
  Running =
    [P || P <- processes(), process_info(P, status) =/= {status, waiting}],
  length(Running) == 1
end.

everyone_blocked() ->
  case only_one_not_waiting() of
    true -> ok;
    false -> everyone_blocked()
  end.

如果最终达到此状态,则忽略计时器,only_one_not_waiting/0重复运行直到它返回 true(如所做的那样)应该指示所需的系统状态。everyone_blocked/0

但是,我不确定应该对process_info(P, status).

于 2013-02-25T10:30:45.113 回答