《Erlang程序設計》第8章習題解

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章