❓기존 문제점
- 리스트 컨트롤 동시 접근 문제
- 로그 남길 때 UI상에서 보여주는 로그창에 동시접근 문제
- 삽입, 설정, 삭제 를 동시에 실행하면 문제 발생 가능성 있음
- 파일 쓰기 동시 접근 문제
- CSV 남길 때 같은 로그 파일(.csv)에 대해 여러 쓰레드가 동시에 접근하면 충돌할 가능성이 있다
✅해결 방법
CCriticalSection을 사용하여 파일 동기화
🔍 CCriticalSection( CCriticalSection ) 동작 방식
1. 한 스레드가 WriteSystemLog에 진입하면 락을 획득 (CSingleLock lock(&csLogWrite, TRUE);)
2. 다른 스레드는 락이 해제될 때까지 대기
3. 파일 쓰기가 끝나면 락이 자동으로 해제됨
CCriticalSection은 Windows 내부 최적화가 되어 있어서 가볍다 → MFC 환경에서 사용 권장된다.(mutex랑 유사하지만 얘는 MFC전용이 아)
예제 코드
CCriticalSection csLogWrite;
void CDlgSystemLog::WriteSystemLog(CString str)
{
CSingleLock lock(&csLogWrite, TRUE); // 🔒 여기서 Lock을 획득 (다른 스레드는 대기)
CTime time = CTime::GetCurrentTime();
CString strFile;
strFile.Format(_T("%s\\Log\\%s\\%s_SYSTEM_LOG.txt"), DEFAULT_GLIM, time.Format("%Y%m%d"), time.Format("%Y%m%d"));
m_XFile.XCreateDirectory(strFile);
FILE* fp = _wfopen(strFile, _T("a, ccs=UTF-8")); // UTF-8 모드로 파일 열기 (MSVC 지원)
if (!fp)
return;
fputws(str + _T("\n"), fp);
fclose(fp);
// 🔓 lock이 스코프에서 벗어나면서 자동으로 해제됨
}
💡 CSingleLock이 lock을 소멸할 때 자동으로 Unlock()이 호출
참고로 프로젝트 속성에서 문자 집합은 '유니코드 문자 집합 사용'으로 되어있다.
'개발공부 > C++' 카테고리의 다른 글
[C++ MFC] 화면 캡쳐하는 함수 (0) | 2025.03.11 |
---|---|
test dword ptr [eax],eax ; probe page. 오류 해결 (0) | 2025.03.10 |
[C++ MFC] 문자열 _T("")와 L"" (0) | 2024.12.26 |
[C++] 폴더 없을 때 폴더 생성 (0) | 2024.12.17 |
[C++ ] Systemtime : 시스템 시간 날짜 얻어오기 (0) | 2024.12.17 |