반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

폴크(FOLC)

데이터 공유 - 주의 사항 ( LockFileEx ) 본문

카테고리 없음

데이터 공유 - 주의 사항 ( LockFileEx )

folcjin 2025. 5. 11. 21:29
728x90
반응형

LockFileEx는 Windows API에서 파일의 일부 또는 전체에 대해 동기적 또는 비동기적 잠금 (lock) 을 설정하기 위해 사용되는 함수입니다. 이는 여러 프로세스 또는 스레드가 동일한 파일을 동시에 열 때 데이터 손상이나 동기화 문제를 방지하는 데 필수적입니다.


함수 시그니처

BOOL LockFileEx( HANDLE hFile, DWORD dwFlags, DWORD dwReserved, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh, LPOVERLAPPED lpOverlapped );

매개변수 설명

파라미터설명
hFile 잠금을 설정할 파일 핸들. CreateFile로 얻은 유효한 핸들이어야 하며 FILE_SHARE_* 플래그 설정에 주의.
dwFlags 잠금 옵션. 주로 다음 값을 가짐:
- LOCKFILE_EXCLUSIVE_LOCK (배타적 잠금)
- LOCKFILE_FAIL_IMMEDIATELY (잠금 실패 시 즉시 반환)
dwReserved 예약 필드. 항상 0이어야 함.
nNumberOfBytesToLockLow 잠금 시작 위치로부터 잠글 바이트 수의 하위 32비트.
nNumberOfBytesToLockHigh 잠글 바이트 수의 상위 32비트 (보통 0).
lpOverlapped 잠금의 시작 오프셋을 지정하는 OVERLAPPED 구조체. 잠금 오프셋은 이 구조체의 Offset 및 OffsetHigh 필드로 지정됨.
 

 

주요 플래그 설명

  • LOCKFILE_EXCLUSIVE_LOCK
    다른 프로세스나 스레드가 해당 영역을 읽기/쓰기 모두 할 수 없도록 막는 배타적 잠금입니다.
  • LOCKFILE_FAIL_IMMEDIATELY
    잠금이 실패하면 대기하지 않고 바로 FALSE를 반환합니다. 비동기적 시도에 유용.

OVERLAPPED 구조체

잠금은 파일 전체가 아닌 일부에만 걸 수 있으므로, OVERLAPPED 구조체를 이용해 시작 위치를 설정합니다:

OVERLAPPED overlapped = {0}; overlapped.Offset = 0; // 시작 위치 하위 32비트 overlapped.OffsetHigh = 0; // 시작 위치 상위 32비트

사용 예시

HANDLE hFile = CreateFile( "example.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); OVERLAPPED ol = {0}; BOOL success = LockFileEx( hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 100, 0, // 100바이트 잠금 &ol); if (success) { // 잠금 성공 } else { // 실패 원인은 GetLastError()로 확인 }

UnlockFileEx와의 관계

LockFileEx로 잠근 파일 영역은 UnlockFileEx 로 반드시 해제해야 합니다.

UnlockFileEx(hFile, 0, 100, 0, &ol);

주의사항

  • 파일 공유 모드 (CreateFile의 dwShareMode)가 잠금 동작에 영향을 줍니다.
  • 락을 획득하지 못하면 ERROR_LOCK_VIOLATION (33) 같은 에러가 발생할 수 있음.
  • 멀티스레드 환경 또는 프로세스 간 데이터 동기화에 유용하지만, 구현 복잡도에 따라 deadlock 가능성도 고려해야 합니다.
728x90
반응형
사업자 정보 표시
사업자 등록번호 : -- | TEL : --