北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 6364|回复: 0

轻轻松松学PIKE 之三(zz)

[复制链接]
发表于 2004-6-18 18:26:33 | 显示全部楼层 |阅读模式
作者: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
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-4-25 05:35 AM , Processed in 0.008929 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表