魔兽世界私服trinitycore2的架构(4)工作线程

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是每个world session使用的端口,当WorldSocket::open的时候,会调用WorldSocketMgr::OnSocketOpen,挂接到线程 池中,m_NetThreads[min].AddSocket(sock)。有个地方必须注意,WorldSocket的open是实现继承自ACE SVR HANDLE的方法。在trinity core2的其他代码中没有调用,很容易摸不着头脑。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方法是主要的业务逻辑过程。他负责串行处理所有的业务逻辑。这个架构有很大的问题,实际上,一旦某个业务逻辑发生阻塞,极有可能对整个系统造成很大的问题。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值