【Muduo源码剖析笔记】 基础组件之Types.h

本文是关于Muduo库的基础组件剖析,重点讨论了Types.h中的定义,包括memset的使用、隐式转换函数implicit_cast以及GCC的原子操作。此外,详细介绍了BlockingQueue和BoundedBlockingQueue的实现,包括它们的数据成员、put和take方法,强调了线程安全和效率优化。
摘要由CSDN通过智能技术生成

【Muduo源码剖析笔记】 基础组件之Types、Atomic、BlockingQueue、BoundedBlockingQueue

//是说这个变量是存在,但是不在(可能)当前的编译单元,后续链接时会在哪里发现
//大家共用这个全局变量
//如果在链接的时候,没有在任何地方发现这个变量的定义
//即没有不带 extern 的 int x,报链接错误
extern int x; 

//是说这个变量是存在,且只存在当前编译单元,也可以叫它本地全局变量。
//可能多个编译单元都会有这个定义,比如这句写在一个 header 文件中
//多个 source 文件 include 了这个 header 文件
//那么每个 source 文件中都可以使用 x,但是每个 x 是独立存在
//即在 a.cpp 的 x 就是 a_x,在 b.cpp 的 x 就是 b_x。相互不会影响。
static int x;

  • memset函数:Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
  • implicit_cast: https://blog.csdn.net/xiaoC_fantasy/article/details/79570788
  • Gcc 4.1.2版本之后,对X86或X86_64支持内置原子操作。就是说,不需要引入第三方库(如pthread)的锁保护,即可对1、2、4、8字节的数值或指针类型,进行原子加/减/与/或/异或等操作。有了这套内置原子操作函数,写程序方便很多。

inline To implicit_cast(From const &f)

{

refurn f; //实现一种 static_cast 或者 const_cast在向上转型时的安全版本。

}//只能用在up_cast,当需要down_cast(这种形式)时候我们就应该使用上面的down_cast(上面的代码)。

type __sync_val_compare_and_swap (type *ptr, type oldval type newval, …)
// 比较ptr与oldval的值,如果两者相等,则将newval更新到ptr并返回操作之前*ptr的值

https://zhuanlan.zhihu.com/p/32303037

“原子操作(atomic operation)是不需要synchronized”,这是多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch [1] (切换到另一个线程)。

BlockingQueue

是一个模板类,有三个数据成员,一个类中的锁mutex_:用于保护条件变量和Queue。一个条件变量。一个类型为std::deque<T>的queue_。

put(const T& x): 把x放入queue中,同时发送通知,queue现在不空了。

put(T&& x): 移动右值的重载版本

take() : 要从里面拿东西,如果是空的,就需要等待notEmpty_条件变量的通知,由put函数通知。

drain():使用std::move把queue_的东西移动到局部变量queue上,然后释放。

BoundedBlockingQueue

有4个数据成员,mutex_锁,notEmpty_和notFull_条件变量,boost:circular_buffer<T>类型的queue_。

put(const T& x):如果queue满了,就会等take()函数发送的非空通知。再把x放入queue中

put(T&& x): 同上。

take():注意有 T front(std::move(queue.front()))

会把queue.front()返回的副本进行move化,然后给front。减少匿名对象的拷贝成本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值