# re: 实现了一个写LOG类 回复 更多评论
2009-01-16 11:06 by
一个线程在调用uninit,另一个线程可能在调用log,这样就有问题,假若 m_bEndThread = true,ThreadProc退出了,这时log对信号量递增计数,有泄露。当然,日志结束一般也是进程结束的时候,无所谓了
# re: 实现了一个写LOG类 回复 更多评论
2009-01-16 13:44 by
@true
感谢, uninit 修改为这样
bool uninit()
{
m_bEndThread = true ;
DWORD dwRet = ::WaitForSingleObject(m_hThread, INFINITE);
if ( dwRet == WAIT_FAILED )
return false ;
::ReleaseSemaphore(m_hSemaphore, 1 , NULL);
::CloseHandle(m_hSemaphore);
m_hSemaphore = NULL;
::DeleteCriticalSection( & m_CriticalSection);
return true ;
}
# re: 实现了一个写LOG类 回复 更多评论
2009-01-16 13:44 by
@abettor
log4c 感觉太庞大了,我只需要实现单条线程去写LOG信息,如此而已!
# re: 实现了一个写LOG类 回复 更多评论
2009-01-16 16:00 by
@sleepwom
修改后的还是不对的:if ( dwRet == WAIT_FAILED )
return false ; 中途返回的话,m_CriticalSection就泄漏了。
# re: 实现了一个写LOG类 回复 更多评论
2009-01-16 22:18 by
@Matrixcoding
楼上的,我还真的不知道怎么改
# re: 实现了一个写LOG类 回复 更多评论
2009-01-16 22:19 by
critical section在构造函数申请,析构函数释放。
创建log的线程负责释放log
其他线程负责使用log
log自己操作critical section
永不泄漏
# re: 实现了一个写LOG类 回复 更多评论
2009-01-18 13:41 by
写一个完善的LOG类是很困难的,我觉得有可以使用和一些日志库同样的接口,可能实现时只是输出到cout,而后如有必要可方便地引入庞大的日志库(如:log4cxx),用日志库其实一点都不麻烦,只是多了一点初始化的工作,真正记日志的接口是很简单的,发行时带上1MB的运行时库通常不是大问题,重要的是你不必担心日志相关的代码会有问题。
# re: 实现了一个写LOG类 回复 更多评论
2009-01-19 10:16 by
@sleepwom
简单点,return false之前把m_CriticalSection也释放了。复杂点的就包装一个良好界面的锁机制。