(1)编写一个函数start(AnAtom,Fun)来把spawn(Fun)的结果注册为AnAtom。当两个并行的进行同时执行到start/2函数时,要确保代码能够正常工作。也就是说,这两个进程其中一个成功执行,而另一个必须执行失败。
-module(ex1).
-compile(export_all).
main(_) ->
start(abc, fun() -> io:format("Bing~n") end),
start(abc, fun() -> io:format("Bang~n") end).
start(AnAtom, Fun) ->
R = self(),
spawn(
fun() ->
try register(AnAtom, self()) of
true->
R ! true,
Fun()
catch
error:_ ->
R ! false
end
end
),
receive
true -> true;
false -> io:format("false ~n")
end.
(2)编写一个环形基准测试。在一个环形创建N个进程。然后沿着环发送一条消息M次,最后总共发送N*M条消息。在N和M的不同取值下测试整个过程会消耗多长时间。
-module(ex2).
-compile(export_all).
main() ->
start(1000, 10),
start(1000, 20),
start(2000, 10).
start(N, M) ->
statistics(runtime),
statistics(wall_clock),
L = create(N, []),
post(haha, L, M),
{_, Time1} = statistics(runtime),
{_, Time2} = statistics(wall_clock),
io:format("Total time : ~p(~p) ~n", [Time1*1000, Time2*1000]).
create(0, L) ->
L;
create(N, L) ->
Pid = spawn(fun loop/0),
create(N-1, [Pid|L]).
loop() ->
receive
Any ->
io:format("Msg arrived: ~p~n", [Any]),
loop()
end.
post(_ , _, 0) ->
void;
post(Msg, L, M) ->
%io:format("M = ~p~n", [M]),
[ H ! Msg || H <-L],
post(Msg, L, M-1).
参考资料:
http://blog.lzhaohao.info/archive/a-solution-of-the-exercise-in-chapter-8-in-erlang-programming/《不沉之月》