【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。减少匿名对象的拷贝成本。