多线程下输出Log

最近项目中需要用到多线程,难免会遇到各种问题。大家知道,多线程是很难调试的。于是我想在可能引发错误的函数入口和出口分别打上log信息,这样就可以分析哪里出错了。我自己封装了一个用来输出log信息的类,经过调试,发现使用起来还是挺方便的,因此拿出来与大家分享。

1.这个类是单例模式,因为要在多线程里使用,输出信息到同一个log文件中,因此单例模式是比较好的选择。

2.解决多个线程同时写一个log文件的办法有几种,一是加锁,二是用一个消息队列,把要打印的信息放到一个链表里,然后开启一个专门的线程从这个链表里取数据,输出到log文件中。我用的是第二种方式,因为这种方式效率很高,不用在调用的地方等待。


下面是我的源代码:

#include "stdafx.h"
#include<iostream>
#include<process.h>
#include<windows.h>
#include<list>
#include<string>
using namespace std;
class CBaselock
{
public:
CBaselock()
{
InitializeCriticalSection(&m_Sec);//初始化临界区
}
~CBaselock()
{
DeleteCriticalSection(&m_Sec);
}
void Lock()
{
EnterCriticalSection(&m_Sec);
}
void UnLock()
{
LeaveCriticalSection(&m_Sec);
}
private:
CRITICAL_SECTION m_Sec;
};


class CLog
{
public:
static CLog* getInstance()//返回CLog的单例
{
static CLog m_log;
return &m_log;
}
void PushLogInfo(char* szInfo);
static unsigned __stdcall SaveLogThred(void * pThis)//保存Log线程
{
CLog * pthX = (CLog*)pThis;
pthX->SaveLogInfo();
return 1;
}
private:
CLog();
~CLog();
void SaveLogInfo();
FILE* m_pFile;
CBaselock m_lock;
char m_szLogPath[MAX_PATH];
list<string> m_InfoLst;
bool m_IsRun;


};
CLog::CLog()
{
GetModuleFileNameA(NULL, m_szLogPath, MAX_PATH); //获取当前程序exe的全路径
strrchr(m_szLogPath, '\\')[1] = '\0';//去掉exe文件名
strcat_s(m_szLogPath,"Log.txt");//重新命名
fopen_s(&m_pFile, m_szLogPath, "w+");//打开Log.txt文件,如果不存在,则创建该文件
m_IsRun = true;
_beginthreadex(NULL, 0, &SaveLogThred, this, 0, 0);
}
CLog::~CLog()
{
m_IsRun = false; //自然中止SaveLogThred线程
Sleep(1000);//确保SaveLogInfo()中的while循环自然中止。
fclose(m_pFile);
}
void CLog::PushLogInfo(char* szInfo)
{
m_lock.Lock();
m_InfoLst.push_back(szInfo);
m_lock.UnLock();
}
void CLog::SaveLogInfo()
{
while (m_IsRun)
{
if (m_InfoLst.empty())
{
Sleep(10);
continue;
}
fputs(m_InfoLst.front().c_str(), m_pFile);
fflush(m_pFile);
m_lock.Lock();
m_InfoLst.pop_front();
m_lock.UnLock();
Sleep(0);
}
}



在需要输出log的地方这样调用:

CLog* pLog = CLog::getInstance();
pLog->PushLogInfo(“123456”);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值