异步日志实现:
主要包含两个部分: 1. 日志模块 2.阻塞队列模块,其中加入阻塞队列模块主要是解决异步写入日志做准备.
阻塞队列模块:
实现了一个模板类循环队列
block_queue(int max_size = 1000)
//根据max_size的大小对循环队列进行构造,这个里面主要有以下几个属性:
1. m_max_size: 循环队列能容纳的最大元素个数
2. m_array: 具体的循环队列,是个指针,根据max_size用new来创建new T[max_size]
3. m_size: 用来记录当前队列中存在的元素个数
4. m_front: 队列的头
5. m_back: 队列的尾
6. 互斥锁: 用动态方式进行初始化 m_mutex
7. 条件变量: 用动态方式进行初始化 m_cond
clear(): 清空循环队列,每次清空前对循环队列加锁,防止其他线程对其大小进行改变。
~block_queue(): 析构函数,首先利用锁对循环队列进行delete,之后delete掉互斥锁和条件变量。
full(): 判断队列是否满,判断前进行加锁,判断返回前解锁,如果m_size >= m_max_size就是满了。
empty(): 判断队列是否为空。如果m_size == 0则为空。
front(T &value): 队首元素,返回是否有队首元素,形参来进行值传递。
back(T &value): 队尾元素,返回是否有队尾元素,形参值传递。
size(): 返回当前队列中元素个数。
max_size(): 返回当前队列所能存在的最大元素个数。
push(const T &item): 往队列中添加元素,如果队已经满了就设置条件变量唤醒线程返回push失败,否则就将这个元素添加进队列中,并唤醒线程返回true。
pop(T &item): 元素出队列,如果没有元素就会循环等待条件变量返回false,否则就将出队并返回true。
pop(T &item, int ms_timeout): 重载的pop出队,增加了超时处理
问题:
1. 条件变量和互斥锁?互斥锁与条件变量详解_lwz-qq的博客-CSDN博客_条件变量和互斥锁
总结:条件变量就是让线程在某一个条件到达后被唤醒,就是从一个线程等待到唤醒的改变,条件变量通常和互斥锁相结合使用。
2. gettimeofday?C语言gettimeofday()函数:获取当前时间_C语言中文网 (biancheng.net)
总结:获取当前时间
3. pthread_cond_timedwait?pthread_cond_timedwait函数使用_霍宏鹏的博客-CSDN博客_pthread_cond_timedwait