muduo库中高效的异步日志实现主要是用了多缓冲的思想
1.在生产者端:
在构造函数的时候添加了两个变量,分别表示现在的缓冲区和下一个备用的缓冲区
在生产者多线程写的时候,先锁住,然后往现在的缓冲区内写,如果缓冲区满,那么将该缓冲区加到buffers中(buffers用来当中间队列的)
然后把备用的缓冲区next取出作为cur缓冲区使用。最后使用条件变量通知后端线程队列不为空。
2.在消费者端
先创建两个空的缓冲区以及一个最后写文件的缓冲区
然后进行加锁并且使用条件变量等待队列不为空(前端向buffers加了数据,且发送了cond_.notify();
这时候把cur全部移动到buffers中,然后在把新申请的newbuffers1移动到cur中作为新的可用cur。最后把buffers全部缓存的数据
和bufferstowrite交换,这样在后面进行文件的写操作时,对buffertowrite进行操作不会影响buffers,那么就可以不进行加锁,就可以很
高效的进行文件的写入。
3.如何处理前端写入队列太快问题
如果bufferstowirte的size超过25,表示buffers接收了太多的日志,且还没有来得及处理,那么就丢掉多余的日志
只剩两个buffer,然后把buffertowrite中的所有的buffer写入到output中,最后把buffertowrite中的前两个空间给newbuffer1和newbuffer2