소연의_개발일지

 

 

❓기존 문제점

  • 리스트 컨트롤 동시 접근 문제
    • 로그 남길 때 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()이 호출

참고로 프로젝트 속성에서 문자 집합은 '유니코드 문자 집합 사용'으로 되어있다.

 

 

profile

소연의_개발일지

@ssoyxon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!