1

私はプロセスで素数を見つけるErlangプログラムを作ろうとしています(効果がない、私は知っていますが、ちょっと、それはただの楽しみのためです:))- numbersimulation.comの線に沿った何か。

「ティック」ごとに、サーバーはカウンターをインクリメントする新しいプロセス(「番号」)を生成します。counter ==その数の場合、それは要因なので、サーバーに通知します。サーバーがメッセージを受け取らない場合、それは素数です。

小さい数(Nまでの素数、server(50,L)線)では問題ありませんが、大きい数では次のようにクラッシュします。

Error in process <0.46.0> with exit value: {badarg,[{primes,number,2,[{file,"primes.erl"},{line,31}]}]}

31行目ですが、なぜ失敗するのserver ! hitわかりません。たぶん、失敗する行は次の行number(N,1)ですか?しかし、なぜそれは失敗するのでしょうか?

コード:

-module(primes).
-compile(export_all).

main() ->
  pg:create(numbers),
  Server_PID = spawn(?MODULE,server,[]),
  register(server,Server_PID),
  ok.

server()     -> server(2,[]).
server(50,L) -> io:format("Primes: ~p~n",[L]);
server(N,L)  ->
  Num_PID = spawn(?MODULE,number,[N]),
  pg:join(numbers,Num_PID),
  pg:send(numbers,tick),
  receive
    hit ->
      flush(),
      server(N+1,L)
  after 100 ->
      server(N+1,[N|L])
  end.

number(N)   -> receive {pg_message,_,_,tick} -> number(N,1) end.
number(N,I) ->
  receive
    {pg_message,_,_,tick} ->
      if
        N =:= I ->
          server ! hit,
          number(N,1);
        true ->
          number(N,I+1)
      end
  end.

flush() ->
  receive _ -> flush()
  after   0 -> ok end.
4

1 に答える 1

8

登録されたプロセスが終了すると、そのプロセスが登録されていた名前は登録されなくなります。デッドプロセスを参照するpidにメッセージを送信することは完全に合法ですが(メッセージが消えるだけです)、名前が一度登録されていても、未登録の名前に送信することはエラーです。

コードでは、serverプロセスは50ループを実行して新しいプロセスを生成し、hitメッセージまたはタイムアウトを待機します。その後、server/2関数は終了し、serverプロセスは終了します。死ぬと名前serverは登録されなくなるので、メッセージを送信しようとするとbadargエラーが発生します。

于 2012-10-02T21:29:16.043 に答える