加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 湛江站长网 (https://www.0759zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

实例:一个服务器程序的架构介绍

发布时间:2019-01-27 06:23:03 所属栏目:业界 来源:高性能服务器开发
导读:副标题#e# 本文将介绍我曾经做过的一个项目的服务器架构和服务器编程的一些重要细节。 一、程序运行环境 操作系统:Centos 7.0 编译器:gcc/g++ 4.8.3、cmake 2.8.11 mysql数据库:5.5.47 项目代码管理工具:Visual Studio 2013 一、程序结构 该程序总共有

因为每个工作线程都存在一个 m_functors,现在问题来了,如何将产生的任务均衡地分配给每个工作线程。这个做法类似上文中如何将新连接的 socket 句柄挂载到工作线程的 epollfd 上,也是 round-robin 算法。上文已经描述,此处不再赘述。

还有种情况,就是希望任务产生时,工作线程能够立马执行这些任务,而不是等 epoll_wait 超时返回之后。这个时候的做法,就是使用一些技巧唤醒epoll_wait,Linux 系统可以使用socketpair 或 timerevent、eventfd 等技巧。

问题 1 的答案是:业务层产生任务可能会交给数据库任务队列A,这里的业务层代码可能就是工作线程中 do_other_things() 函数执行体中的调用。至于交给这个 9 个数据库线程的哪一个的任务队列,同样采用了 round-robin 算法。所以就存在一个对象 CDbThreadManager来管理这九个数据库线程。下面的伪码是向数据库工作线程中加入任务:

  1. bool CDbThreadManager::AddTask(IMysqlTask* poTask )   
  2. {   
  3.     if (m_index >= m_dwThreadsCount)   
  4.     {   
  5.         m_index = 0;   
  6.     }   
  7.  
  8.     return m_aoMysqlThreads[m_index++].AddTask(poTask);   

同理问题 2 中的消费者也可能就是 do_other_things() 函数执行体中的调用。

(编辑:PHP编程网 - 湛江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!