一個(gè)線程在調(diào)用uninit,另一個(gè)線程可能在調(diào)用log,這樣就有問題,假若 m_bEndThread = true,ThreadProc退出了,這時(shí)log對(duì)信號(hào)量遞增計(jì)數(shù),有泄露。當(dāng)然,日志結(jié)束一般也是進(jìn)程結(jié)束的時(shí)候,無所謂了
@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 ;
}
@abettor
log4c 感覺太龐大了,我只需要實(shí)現(xiàn)單條線程去寫LOG信息,如此而已!
@sleepwom
修改后的還是不對(duì)的:if ( dwRet == WAIT_FAILED )
return false ; 中途返回的話,m_CriticalSection就泄漏了。
@Matrixcoding
樓上的,我還真的不知道怎么改
critical section在構(gòu)造函數(shù)申請(qǐng),析構(gòu)函數(shù)釋放。
創(chuàng)建log的線程負(fù)責(zé)釋放log
其他線程負(fù)責(zé)使用log
log自己操作critical section
永不泄漏
寫一個(gè)完善的LOG類是很困難的,我覺得有可以使用和一些日志庫同樣的接口,可能實(shí)現(xiàn)時(shí)只是輸出到cout,而后如有必要可方便地引入龐大的日志庫(如:log4cxx),用日志庫其實(shí)一點(diǎn)都不麻煩,只是多了一點(diǎn)初始化的工作,真正記日志的接口是很簡單的,發(fā)行時(shí)帶上1MB的運(yùn)行時(shí)庫通常不是大問題,重要的是你不必?fù)?dān)心日志相關(guān)的代碼會(huì)有問題。
@sleepwom
簡單點(diǎn),return false之前把m_CriticalSection也釋放了。復(fù)雜點(diǎn)的就包裝一個(gè)良好界面的鎖機(jī)制。