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/0trueが返されるまで(そうするようにeveryone_blocked/0)繰り返し実行すると、最終的にこの状態に達した場合に、目的のシステム状態を示すはずです。

ただし、の戻り値にどれだけの信頼を置くべきかわかりませんprocess_info(P, status)

于 2013-02-25T10:30:45.113 に答える