轻轻松松学PIKE 之三(zz)
作者:super 更新日期:2004-01-16 类别:MUD文档->技术资料 总浏览/今日:2/1轻轻松松学PIKE 之三
PIKE在工程建设中也有相当大的威力的。
大家都知道,每个程序都有一个出口,程序运行完以后,程序的代码就会
从内存中清除,如果要运行一个不会中断的程序,比如一个WEB SERVER
要怎么做呢?在PIKE里面只需要在main()函数里面简单的一个return -17;
即可。return -17不会做任何事,只是告诉系统这个进程还没执行完,不
要结束。
由于PIKE的->运算符前面的必须是一个物件,而不象LPC一样可以是一个
string,所以类似设计LPC里面的#define LOGIN_D "/adm/daemons/logind.c"
是不太好办的,当然,你完全可以
#define LOGIN_D ((program)"/adm/daemons/logind.pike")();来代替
但是这样做的弊端就是每出现LOGIN_D的地方就会重新复制出一个logind.pike
严重浪费资源,完全没有达到我们想要的效果。
在PIKE里面,我们可以用add_constant(string,mixed)来做。
add_constant()所做的就是根据一个固定的key绑定到一个固定的地址上。
跟mapping类似,都是使用了HASH表,不同的是,add_constant()出来的东西
可以出现在代码的任何地方。比如我:add_constant("hello",1);
那么之后只要在代码中出现了hello,都将替换成"hello"指向的地址上的内容。
跟JAVA一样,PIKE有自动回收垃圾(Garbage collection)的功能。
这使得我们在设计和组建某项工程的时候,可以把更多时间放在设计,而不是
实现上。
PIKE的多线程也是一个亮点,就如同LPC里面的call_other()一样简单,实在。
不过对于多线程间的同步也是一个相当大的问题,对此,可以用线程队列来解决。
使用方法如下:
import Thread;
inherit Queue : queue;
int n = 0;
void foo()
{
write("I'm " + n +"n");
n++;
}
void create()
{
function f() { return foo(sth); };
for(int i = 0;i<5;i ++)
queue::write(f);
thread_create(queue::read()());
}
这样就是一个大小为5的线程队列的模型了。其中write()是把一个线程加入队列。
read()是从队列中读出一个线程,由于我写入的是一个function,所以read()出来
的也是一个function,所以用read()()来执行这个function。
------------------------------------------------------------------
super@mudbuilder.net
页:
[1]