ACE,Python和Java(我所知道的)中要获得多线程的能力,都是通过从一个线程对象基类继承,重载特定的成员函数来实现。简单的来看,它用起 来也相当简单,理解起来也不复杂,但,用过一段时间之后,就会发现处理复杂问题时,你会遇到许多的限制。
1.必须从一个线程对象基类继承吗?
现在看来是的,否则,你只有使用系统OS提供的线程函数了。
2.我已经有个类了,它不是从线程对象基类继承的,我要使用多继承吗?
是的,除非重写。
3.我有一个函数,想让他在另一个线程执行,一定要写个类吗?
是的。
4.我有一个类,它的每个成员函数我都想他们在另外的线程中执行,怎么办?
线程对象基类只有一个线程函数,你必须通过某种通讯机制去让它执行不同的成员函数。
4.当线程在执行一个对象的某个成员时,这个对象被删除了怎么办?
没办法,你必须自己管理对象的生存期。
呜呼!问题越来越多,该怎么办?我们需要某种透明的线程模型,他能处理任意的需要被异步执行的类的成员函数或者普通函数,它能提供一种策略,使得我们能 自动管理处理不同线程中的对象的生存期。我们现在有了这种工具了吗?
熟悉Boost的人可能觉得boost.thread也许提供了这种能力。很不幸,它满足了一部分上述需求。
正在实现上述需求的一个线程模型。它将任务与任务的执行者分离,它支持人任何的任务,不论它是普通的函数,还是具有任意参数的成员函数,你均能将它作为 一个任务抛到其他的线程执行,它是非侵入式,通过它所支持的生命期管理,你不用在担心对象在异步执行时被销毁。它用模板实现。
开始了一些基础库的代码编写,基本的设计原则是:
1.基于模板
2.尽量使用组合
3.尽量不依赖第三方库
基础库将包含以下几个核心的功能:
1.对象生存期的自动管理
2.透明的内存管理
3.透明的线程管理
4.数据的对象化存储
5.远程对象通讯/代理
现在做的是个Mysql对象化访问的组件。我们知道mysql是关系数据库,但我们提供了一组在一定程度下的对象化操作mysql的功能,使用这个组
件,你将面对的是一个个对象,而不在是一张张表,但,面向对象数据库现在还处于理论的验证期,现在还没有成熟的数据库产品被大规模使用,主要使用的还是关系数据库,我们提供的这一层对象化访问层不可能做到完全的面向对象数据库能力,但可以满足一般的需求,但这就足够了,至少我是这么认为。
所谓的无缝服务器是指一个游戏只有一个游戏世界,游戏中所有的角色都互相可见,可交互的。
传统的游戏服务器是分区的。进入游戏之前,先要选择游戏服务器组,再选择一个服务进入。进入游戏后如何要从一个地图到另一个地图,则要切换服务器(客户端或者接入服务器内部切换),对玩家来说,则是画面切换,像大话西游,传奇都是这样。魔兽世界在进入服务器后,如果不前往另一个大陆,则无换面切换,但 这不是真正的无缝。
无缝服务器复杂的根本是服务大量(甚至海量)玩家的要求。玩家多意味着交互多,数据流量大,必然要将请求发往多个服务器处理,于是问题就来了,那就是服务器交互。传统分区服务器设计也是多服务器的,但服务器相数量较小,交互的复杂性不大。但,考虑无缝服务器要服务的是海量的玩家请求,服务器数量比传统服务器大的多。
考虑下面的情况:
A玩家连接svr1,B玩家连接svr2,C玩家连接服务器svr3。现在A要砍B一下,svr1接到了A砍B的请求,但在svr1上没有B玩家,它如何才能找到B呢?也许加一个全局的玩家位置服务器可以解决这个问题,这个服务器上记录了每个玩家位于哪个服务器。但,考虑下,这个全局服务器只有一台吗?它可以处理所有的玩家吗?如果人数太多,在增加一台这样的服务器会怎么样?它们之间如何交互?很快就会发现,这个方法行不同。其实,这种全局服务器 的存在是分区服务器时代的产物,在无缝的前提下,不会在有全局服务器这样的东西。全局意味着唯一,而无缝则要求无限动态扩展。
无缝服务器的关键是维护一个服务的网状结构,只有这样,才可能动态扩展。
MMORPG无缝服务器开发论坛建立,现邀请成员加入!