(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/《不沉之月》