并发Erlang代码

时间:2017-04-07 08:43:33

标签: concurrency erlang

从旧考试开始,有一个问题我不明白答案。问题的模块如下所示:

-module(p4).
-export([start/0, init/0, f1/1, f2/1, f3/2]).

start() ->
    spawn(fun() -> init() end).

init() ->  loop(0).

loop(N) ->
    receive
        {f1, Pid} ->
            Pid ! {f1r, self(), N},
            loop(N);
        {f2, Pid} ->
            Pid ! {f2r, self()},
            loop(N+1);
        {f3, Pid, M} ->
            Pid ! {f3r, self()},
            loop(M)
    end.

f1(Serv) ->
    Serv ! {f1, self()},
    receive {f1r, Serv, N} -> N end.

f2(Serv) ->
    Serv ! {f2, self()},
    receive {f2r, Serv} -> ok end.

f3(Serv, N) ->
    Serv ! {f3, self(), N},
    receive {f3r, Serv} -> ok end.

该问题要求将以下函数视为代码的一部分,以及函数的结果是什么。正确答案是2.我认为它是3,因为“增加号召”f2(Server)是在self()!{f1r, Server, 2}的回复之后。

    test3() ->
      Server = start(),
      self()!{f1r, Server, 2},
      f2(Server),
      f1(Server).

我的问题是:

  • 为什么答案2而不是3,以及self()!{f1r, Server, 2}如何运作?
  • 来自self()!{f1r, Server, 2}函数的loop(N)中的receive子句的f1(Serv)响应不是吗?

1 个答案:

答案 0 :(得分:1)

self()!{f1r, Server, 2}{f1r, Server, 2}发送给自己。 此消息将在收件箱中等待,直到收到。

然后执行f2,然后执行f1

在最后一个函数中,当执行最后一行receive {f1r, Serv, N} -> N end时,运行test3的进程收到在收件箱中等待的消息(发送给自己的消息)并返回2消息。

请注意,在程序结束时,收件箱中会有{f1r, <process number>, N}等待,N的值为1.

相关问题