linux线程异常捕捉,c++ 流在多线程下出现不可捕获的错误异常,在 windows 和 linux 中都出现...

当前位置:我的异常网» C++ » c++ 流在多线程下出现不可捕获的错误异常,在 window

c++ 流在多线程下出现不可捕获的错误异常,在 windows 和 linux 中都出现

www.myexceptions.net  网友分享于:2013-02-11  浏览:38次

c++ 流在多线程下出现不可捕获的异常错误,在 windows 和 linux 中都出现,

c++ 流在多线程下出现不可捕获的异常错误,在 windows 和 linux 中都出现,

就是在 需要转存日志的这一行 m_output->close(); 确实怪异,导致程序退出

//头文件 simplelog.h 内容

#ifndef _CSIMPLELOG_INCLUDE_

#define _CSIMPLELOG_INCLUDE_

#include

#include

class MyOSMutex;

class CSimpleLog

{

private:

//日志文件路径

std::string m_logname;

//写文件锁

MyOSMutex *m_mutex;

//日志文件指针

std::ofstream *m_output;

//写缓冲

const unsigned int BUFFSIZE;

char *m_buff;

//char m_buff[BUFFSIZE];

//文件尺寸 20M

int m_maxfilesize;

//sington唯一实例

static CSimpleLog * m_instance;

//转存文件

void inline Save();

//得到新文件名

void inline GetNewFileName(char *filename);

protected:

CSimpleLog();

public:

//初始化

void Initiate(const std::string &logname,int maxfilesize = 20);

//写日志内容

void Addlog(const char* fmt, ...);

//按 16 进制输出数据包

void AddHexlog(const unsigned char *buff,int len);

//得到唯一实例

static CSimpleLog& Instance();

~CSimpleLog(void);

};

#endif

//实现 simplelog.cpp 内容

#include "simplelog.h"

#include "myosmutex.h"

#include

#include

#include

#include

using namespace std;

#include

CSimpleLog * CSimpleLog::m_instance = 0;

CSimpleLog::CSimpleLog():m_mutex(0),

m_output(0),m_buff(0),BUFFSIZE(1024),

m_maxfilesize(1024 * 1024 * 20)

{

if(m_mutex == 0)

{

m_mutex = new MyOSMutex();

}

if(m_buff == 0)

{

m_buff = new char[1024];

}

}

CSimpleLog::~CSimpleLog(void)

{

if(m_output)

{

m_output->flush();

m_output->close();

delete m_output;

m_output = 0;

}

if(m_buff)

{

delete []m_buff;

m_buff = 0;

}

if(m_mutex)

{

delete m_mutex;

m_mutex = 0;

}

delete this;

}

void CSimpleLog::Initiate(const std::string &logname,int maxfilesize)

{

m_maxfilesize = maxfilesize * 1024 * 1024;

m_logname = logname;

size_t length = logname.length();

if(length >= 255 || length < 4)

{

return;

}

char filename[255];

GetNewFileName(filename);

if(m_output == 0)

{

m_output = new std::ofstream(filename,ios::out|ios::ate|ios::app);

}

}

//得到唯一实例

CSimpleLog& CSimpleLog::Instance()

{

for(;;)

{

if(m_instance == 0)

{

m_instance = new CSimpleLog();

}

if(m_instance)

{

break;

}

}

return *m_instance;

}

void CSimpleLog::Addlog(const char* fmt, ...)

{

static unsigned short lines = 0;

m_mutex->Lock();

va_list argptr;

//分析字符串的格式

va_start(argptr,fmt);

#ifdef WIN32

_vsnprintf(m_buff,BUFFSIZE,fmt,argptr);

#else

vsnprintf(m_buff,BUFFSIZE,fmt,argptr);

#endif

va_end(argptr);

//以添加的方式输出到文件

if(m_output)

{

//CDateTime dt;

//(*m_output)<

(*m_output)<

if(m_output->bad())

{

m_output->clear();

}

lines++;

if(lines > 1000)

{

lines = 0;

//m_output->flush();

Save();

}

}

m_mutex->Unlock();

}

void inline CSimpleLog::GetNewFileName(char *filename)

{

//最多存储 50 个日志文件

const int MAXIUMCOUNT = 50;

for(int i = 0;i < MAXIUMCOUNT;++i)

{

//char filename[255];

//文件索引

static unsigned int short fileindex = 0;

memset(filename,0,sizeof(filename));

文章评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值