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

实例:一个处事器措施的架构先容

发布时间:2019-01-20 23:21:59 所属栏目:业界 来源:高性能服务器开发
导读:本文将先容我曾经做过的一个项目标处事器架构和处事器编程的一些重要细节。 一、措施运行情形 操纵体系:Centos 7.0 编译器:gcc/g++ 4.8.3、cmake 2.8.11 mysql数据库:5.5.47 项目代码打点器材:Visual Studio 2013 一、措施布局 该措施总共有 17 个线程

当使命发生时,只要我们将执利用命的函数 push_back 到 m_functors 这个 stl::vector 工具中即可。可是题目来了,假如是其他线程发生的使命,两个线程同时操纵 m_functors,肯定要加锁,这也会影响服从。muduo 是这样做的:

  1. void add_task(const Functor& cb)   
  2. {   
  3.     std::unique_lock<std::mutex> lock(mutex_);   
  4.     m_functors.push_back(cb);      
  5. }   
  6.  
  7. void do_task()   
  8. {   
  9.     std::vector<Functor> functors;   
  10.     {   
  11.         std::unique_lock<std::mutex> lock(mutex_);   
  12.         functors.swap(m_functors);   
  13.     }   
  14.  
  15.     for (size_t i = 0; i < functors.size(); ++i)   
  16.     {   
  17.         functors[i]();   
  18.     }   

看到没有,操作一个栈变量 functors 将 m_functors 中的使命函数指针倒换(swap)过来了,这样大大减小了对 m_functors 操纵时的加锁粒度。前后变革:变革前,相等于原本 A 给 B 几多对象,B 耗损几多,A 给的时辰,B 不能耗损;B 耗损的时辰A不能给。此刻酿成A将对象放到篮子内里去,B 从篮子内里拿,B 假如拿去一部门后,只有耗损完了才会来拿,可能 A 关照 B 去篮子内里拿,而 B 繁忙时,A 是不会关照 B 来拿,这个时辰 A 尽管将对象放在篮子内里就可以了。

  1. bool bBusy = false;   
  2. void add_task(const Functor& cb)   
  3. {   
  4.     std::unique_lock<std::mutex> lock(mutex_);   
  5.     m_functors_.push_back(cb);   
  6.  
  7.     //B不繁忙时尽管往篮子内里加,不要关照B   
  8.     if (!bBusy)   
  9.     {   
  10.         wakeup_to_do_task();   
  11.     }   
  12. }   
  13.  
  14. void do_task()   
  15. {   
  16.     bBusy = true;   
  17.     std::vector<Functor> functors;   
  18.     {   
  19.         std::unique_lock<std::mutex> lock(mutex_);   
  20.         functors.swap(pendingFunctors_);   
  21.     }   
  22.  
  23.     for (size_t i = 0; i < functors.size(); ++i)   
  24.     {   
  25.         functors[i]();   
  26.     }   
  27.  
  28.     bBusy = false;   

看,多奇妙的做法!

(编辑:湖南网)

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

热点阅读