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