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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值