整理了以下项目中用到的一个异步日志IO的实现,基于以下设计:
1. 使用了一个push队列和一个write队列。主线程往push队列中加数据,写线程从write队列中拿数据写到磁盘
2. 默认情况下write线程处于睡眠
3. 有两种情况会唤醒写线程。
1) push队列满后,会调用force_write将push队列和write队列交换并唤醒写线程将日志写入磁盘
2)如果push队列长时间未满,待定时器触发后,也会切换push和write并唤醒写线程。
3)每次写线程工作结束前将重置定时器,避免写线程刚刚写完数据定时器又触发导致无效的切换。
/*
* asynchronous log impelmentation
* FileName: async_log.cpp
* author: sesiria 2021-05-17
*/
#include <signal.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <string>
#include <algorithm>
#define TIMER_EVENT 3 // 3second
#define MAX_BUFFER 1000000 // 100
//=========================&