今天有两个我觉得比较好的题材:就当是补回我上次贴匆匆了解吧 第一个:定义宏
可能第一眼看到这个词就觉得没什么特别,原因是无论在c/c++都是非常常见,甚至
在erlang中。但是今天我发现了宏也可以这样来玩
例:-define(AVERAGE(List),begin Sum=lists:sum(List) ,Length=length(List),Sum/Length end)。
第二个:注册进程
注册进程一般就是用于进程之间的通信,但是我在《erlang编程指南》中,我发现了作者在书中讲述
的互斥信号,用了以下代码来解释深层原理。
-module(mutex).
-export([start/0,stop/0]).
-export([wait/0,signal/0]).
-export([init/0]).
start()->
register(mutex,spawn(?MODULE,init,[])).
stop()->
mutex ! stop.
wait() ->
mutex!{wait,self()},
receive ok -> ok end.
signal() ->
mutex ! {signal,self()},ok.
init() ->
free().
free() ->
receive
{wait,Pid} ->
Pid ! ok,
busy(Pid);
stop ->
terminate
end.
busy(Pid) ->
receive
{signal,Pid} ->
free()
end.
terminate() ->
receive
{wait,Pid} ->
exit (Pid,kill),
terminate()
after
0 -> ok
end.
这段代码中巧妙地用start函数来创建一个进程并注册为mutex,并留下了wait()和signal()、stop()的
接口供使用者调用,而且另一巧妙之处就是作者运用了receive的特性(要收到特定的消息,否则阻塞)
来控制进程的停止。
|