erlang程序设计8.1习题
By admin
(1)编写一个函数start(AnAtom, Fun)来把spawn(Fun)的结果注册为AnAtom。当两个并行的进程同时执行到start/2函数时,要确保代码能够正常工作。也就是说,这两个进程其中一个成功执行,而另一个必须执行失败。
http://blog.lzhaohao.info/archive/a-solution-of-the-exercise-in-chapter-8-in-erlang-programming/
这里有个别人写过的结果,但我觉得不太对。
这个第一题里只是把当前进程注册成了AnAtom,并没有把Fun注册成AnAtom。
这是我第一次做的结果,是错的。保存为ex81,+x权限,用escript执行。
=结果是报错。
我的理解是start的第二个参数这个fun没有执行尾递归,所以执行了一下就结束掉了,虽然还保留了Pid,但是不能被注册,一对这个Pid执行register就会报错。
如果需要进行注册,这个函数里必须包含receive这种代码。
又写了一个
算是的到了习题的结果,两个进程只能执行一个。
但是在main里的两个start,终究感觉还是有先后执行顺序。
考虑下面这个情况
在实际的例子里可以想象成一个网络游戏,有一个gold,谁先捡到归谁,然后两个player在两个客户端都开始send take,然后gold进程本身就会执行这么一个注册程序,由于erlang里的变量都是一次性赋值,也不用加锁,不用在第一个人触发事件的时候给gold的变量加锁,而是把gold独立成一个进程。gold被捡到后会给第一个player进程send一个消息为taken success,之后的第二个乃至更多的player进程都会send taken faild的消息。这么一想,erlang的多进程确实很适合做分布式的大量响应的程序,否则其中要加锁什么的,不知逻辑上要麻烦多少倍。不过这种逻辑的东西我现在倒是还不太能做的出来,作为这个阶段的习题也太难了点。