





























































































































































|
||||||||||||||||||||||
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Feedback一個線程在調用uninit,另一個線程可能在調用log,這樣就有問題,假若 m_bEndThread = true,ThreadProc退出了,這時log對信號量遞增計數,有泄露。當然,日志結束一般也是進程結束的時候,無所謂了
@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 16:00 by Matrixcoding@sleepwom
修改后的還是不對的:if ( dwRet == WAIT_FAILED ) return false ; 中途返回的話,m_CriticalSection就泄漏了。 critical section在構造函數申請,析構函數釋放。
創建log的線程負責釋放log 其他線程負責使用log log自己操作critical section 永不泄漏 寫一個完善的LOG類是很困難的,我覺得有可以使用和一些日志庫同樣的接口,可能實現時只是輸出到cout,而后如有必要可方便地引入龐大的日志庫(如:log4cxx),用日志庫其實一點都不麻煩,只是多了一點初始化的工作,真正記日志的接口是很簡單的,發行時帶上1MB的運行時庫通常不是大問題,重要的是你不必擔心日志相關的代碼會有問題。
# re: 實現了一個寫LOG類 回復 更多評論2009-01-19 10:16 by matrixcoding@gmail.com@sleepwom
簡單點,return false之前把m_CriticalSection也釋放了。復雜點的就包裝一個良好界面的鎖機制。
|
||||||||||||||||||||||