首页 > 代码库 > 线程维护日志队列

线程维护日志队列

基本概念就是,业务线程输出日志(主要是增加日志队列节点),然后副线程负责日志队列的消耗。

这样做的好处就是不会因为日志输出而造成线程阻塞。

代码很简单,如下:

//code by lichmama from cnblogs.com#include <stdio.h>#include <stdlib.h>#include <string.h>#include <windows.h>#include <process.h>struct _log_ {    int log_type;    int log_length;    char log_text[1024];};typedef struct _log_queue_ {    struct _log_ log;    struct _log_queue_ *next;}LOG_QUEUE, *PLOG_QUEUE;HANDLE hmutex = NULL;PLOG_QUEUE head = NULL;PLOG_QUEUE tail = NULL;PLOG_QUEUE temp = NULL;PLOG_QUEUE ttmp = NULL;unsigned  int __stdcall log_thread(void *args){    for(;;){        WaitForSingleObject(hmutex, INFINITE);        if(head){            ttmp = head;            printf("%03d, %d, %s\n", ttmp->log.log_type, ttmp->log.log_length, ttmp->log.log_text);            head = head->next;            if(!head)tail = NULL;            free(ttmp);            ttmp = NULL;        }        ReleaseMutex(hmutex);    }    return 0;}int main(){    HANDLE hmutex = CreateMutex(NULL, TRUE, NULL);    HANDLE hthread = _beginthreadex(NULL, 0, log_thread, NULL, 0, NULL);    char ch;    while((ch=getch())!=q){        temp = (PLOG_QUEUE)malloc(sizeof(LOG_QUEUE));        temp->log.log_type = ch-0;        temp->log.log_length = 11;        strcpy(temp->log.log_text, "hello,world");        temp->next = NULL;        if(!head)tail = temp, head = temp;        else tail->next = temp, tail = temp;    }    CloseHandle(hmutex);    TerminateThread(hthread, 0);    CloseHandle(hthread);    return 0;}