魔兽世界私服trinitycore2的架构(4)工作线程
来源:互联网 发布:卫星轨道数据是一类 编辑:程序博客网 时间:2024/06/09 22:29
trinity core2的主要工作进程是trinity-core,他实际上扮演的是一个服的作用。一个进程带多个线程的架构。本篇主要介绍每个线程的作用,以及相互之间的关联。
1、主线main.cpp,主线程main函数完成配置信息读取之后,会启动sMaster,sMaster不是线程,他实际是工作逻辑总体框架的封装。主线程的循环在sMaster.Run()中实现。
2、sMaster是个单实例,在sMaster中,首先会初始化3个数据库(Login/Character/World)的连接,这3个数据库是以线程池方式在运作。同时,还会初始化sWorld,WorldDatabase/CharacterDatabase/loginDatabase是个全局变量,sWorld是个单实例,实际上,他们都可以看做单实例。sWorld的循环部分,在WorldRunnable.Run中完成,由WorlRunnable循环调用sWorld.Update来更新状态。用来管理的RA功能在RARunnable线程中完成。
值得一提的是,有个单实例sWorldSocketMgr,是sWorld的服务端口。他启动多个服务线程做一个线程池,每个请求的socket,都被排序然后由线程池中线程来服务。
3、WorldSocket.h是每个worldsession使用的端口,当WorldSocket::open的时候,会调用WorldSocketMgr::OnSocketOpen,挂接到线程池中,m_NetThreads[min].AddSocket(sock)。有个地方必须注意,WorldSocket的open是实现继承自ACESVR HANDLE的方法。在trinitycore2的其他代码中没有调用,很容易摸不着头脑。WorldSocketMgr的线程池ReactorRunnable继承自ACE_Task_Base类,他的主要函数svc应该也是和线程的执行体一样。每个执行实际上先是捕获事件,然后遍历所关联的WorldSocket,再执行WorldSocket::Update,WorldSocket的Update很简单,就是将输出发送出去。
4、在sMaster中,通过WorldSocketMgr.Wait()/WorldRunnable.Wait()/RARunnable.Wait()来等待所有的线程结束。WorldDatabase/CharacterDatabase/loginiDatabase的终止,在WorldRunnable中结束。
5、WorldSocket.h继承自ACE_Event_Handler的handle_input用来处理输出数据。handle_input-->handle_input_payload-->ProcessIncoming
在ProcessIncoming中,如果是CMSG_PING/CMSG_AUTH_SESSION/CMSG_KEEP_ALIVE,则由不同的handler来实现。如果是CMSG_AUTH_SESSION,那么则由HandleAuthSession负责创建一个会话,该会话实际上只是实现各种类型报文的Handler。其他类型的报文,则先放在一个队列中,由WorldSession来处理。
6、当WorldSocket创建WorldSession之后,WorldSession就被添加到sWorld的SessionMap中,该map是以AccountID作为关键字的。我们在WorldRunnable中说过,执行体会不断的调用sWorld的Update方法,而在sWorld::Update方法中,就不断的调用WorldSession的Update方法。
上面,我们介绍了各种线程的作用,以及他们之间的关联。sWorld的Update方法是主要的业务逻辑过程。他负责串行处理所有的业务逻辑。这个架构有很大的问题,实际上,一旦某个业务逻辑发生阻塞,极有可能对整个系统造成很大的问题。
- 魔兽世界私服trinitycore2的架构(4)工作线程
- 魔兽世界私服trinitycore2的架构(1)
- 魔兽世界私服trinitycore2的架构(2)
- 魔兽世界私服trinitycore2的架构(3)地图数据
- 魔兽世界私服trinitycore2的架构(5)世界对象
- 魔兽世界私服trinitycore2的架构(6)国际化
- 魔兽世界私服trinitycore2的架构(7)国际化方案
- 魔兽世界私服trinitycore2的架构(8)脚本
- 魔兽世界私服trinitycore2的架构(9)人工智能
- 魔兽世界私服trinitycore2的架构——世界对象
- 魔兽世界私服trinitycore2的数据库TDB(1)
- 魔兽世界私服trinitycore2的数据库TDB(2)
- 魔兽世界私服trinitycore2的数据库TDB(3)
- 魔兽世界私服架设
- 开源的魔兽世界参考架构——mangos
- 谈魔兽世界服务器和客户端交互的架构
- 魔兽世界私服Trinity,从源码开始
- TrinityCore 魔兽世界私服11159 完整配置
- [转载]深入浅出Visual C++动态链接库(Dll)编程
- 动态调用带有WebService(包含有SOAP验证和非SOAP验证)
- fstat、stat和lstat 区别(转)
- win 7 发布了,不知道和VISTA那个好点
- SetWindowsHookEx函数参数详解
- 魔兽世界私服trinitycore2的架构(4)工作线程
- 结构体对齐的具体含义(#pragma pack)
- 找到动力的一句话
- 26 Essential Firefox Add-ons for Web Designers
- hibernate的web编程步骤
- 前几天弄到一个强悍的带显卡的2440开发板
- Win32 OpenGL编程(8) 3D模型变换及其组合应用
- 工作十几年,对时间管理,感悟颇多,分享一下
- 漫谈程序员需要关注的几个细节