网络框架封装_微服务开源框架TARS 之 基础组件

d410e6b42702704a53e269ae7a7eb8bd.gif

9ee278c36dcd28da80dd7e566c813b83.png

本文源自herman的系列文章之一《 鹅厂开源框架TARS之基础组件 (文末附链接)》。相关代码已按TARS开源社区最新版本更新。 TARS开源框架库里面用C++实现了比较多的公用组件,这些组件一般统一放在 `util` 文件夹,在应用层也可以自由使用,工欲善其事必先利其器,所以有必要把这些工具组件做了解,更好的使用,提高效率。接下来,本文将对如下TarsCpp组件进行分析:

• 线程操作

  o 线程安全队列: TC_ThreadQueue

  o 普通线程锁: TC_ThreadLock

  o 线程基类: TC_Thread

• 智能指针

  o 智能指针类: TC_AutoPtr

• DB操作

  o MySQL操作类: TC_Mysql

• 网络操作

  o 网络组件

• 服务配置

  o 命令解析类: TC_Option

  o 配置文件类: TC_Config

• 仿函数

  o 通用仿函数类: TC_Functor

• Hash

  o hash算法

• 异常处理

  o 异常类: TC_Exception

f8a2725acb3e09e304db950ef7c744d3.png

先看下框架对TC_ThreadQueue类的使用如下:

c1d6463bdd57872679636ca460b91b21.png

`TC_ThreadQueue` 的实现比较简单,在TARS的网络层实现中可以发现这个类比较重要,因为从框架中收到的网络包都会加入到这个缓存队列里面,然后多业务线程 `ServantHandle` 会调用 `waitForRecvQueue` 从该队列里面取网络数据包,然后调用 `dispatch` 调用协议消息对应的处理函数,先看下框架对 `TC_ThreadQueue` 的实现:

4d4697755a5204e454a594c6926acbe0.png

TC_ThreadQueue使用了C++11标准库中的和用于实现线程锁和 wait,如下,看下队列的成员函数:push_front 在队列前面加入数据,

0144c8d051d5d6528ddfe0f380b7e30d.png

如上图调用`push_front`函数的时候调用 `std::unique_lock<:mutex> lock(_mutex)`加锁 ,避免网络层接收数据和业务层取同一队列的数据冲突,`_cond.notify_one()` 通知等待在该锁上某一个线程醒过来,调用该函数之前必须加锁,因为有数据过来了,例如网络层有线程需要取包并进行分发处理。

再看一个成员函数`pop_front`,从头部获取数据,没有数据则等待。`millisecond` 阻塞等待时间(ms)

•  `0` 表示不阻塞

• `-1` 永久等待

d8f8a9da758915ecbfd9f0add8f63efe.png

BindAdapter::waitForRecvQueue的函数就是调用了pop_front函数,用于等待接收队列,函数原型如下:

0f5c0fd748c02a90c41037f7367fee3f.png

这里BindAdapter::waitForRecvQueue用于业务线程在等待服务器监听的适配器收到网络包后进行业务包的处理,这里传入的handleIndex表示接收队列索引,获取对应的_rbuffer。

d266293191f26e5658eacfabd42dfead.png

TC_ThreadLock 类的定义如下

f07a5bf4a004f676a393a447a11a571d.png

TC_Monitor 线程锁监控模板类。通常线程锁,都通过该类来使用,而不是直接用TC_ThreadMutex、TC_ThreadRecMutex。

类的定义template class TC_Monitor 需要传入两个模板参数,TC_Monitor 包括以下成员变量:

c97f5b360c243ab66193ce8ed3d11818.png

第一个参数 TC_ThreadMutex 代表线
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值