首页 > 代码库 > 线程维护日志队列
线程维护日志队列
基本概念就是,业务线程输出日志(主要是增加日志队列节点),然后副线程负责日志队列的消耗。
这样做的好处就是不会因为日志输出而造成线程阻塞。
代码很简单,如下:
//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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。