IT공부/IT서적

[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 13장, 14장. 쓰레드 동기화 기법 1, 쓰레드 동기화 기법 2

shine94 2025. 2. 17. 01:56

* 해당 글은 윤성우의 뇌를 자극하는 윈도우즈 시스템 프로그래밍 도서를 읽고 정리한 글입니다

   https://product.kyobobook.co.kr/detail/S000001223395

 

뇌를 자극하는 윈도우즈 시스템 프로그래밍 | 윤성우 - 교보문고

뇌를 자극하는 윈도우즈 시스템 프로그래밍 |

product.kyobobook.co.kr

 

 

 

 

* 실행 순서의 동기화

   쓰레드의 실행순서를 정의하고, 이 순서를 반드시 따르도록 하는 것

 

* 메모리 접근에 대한 동기화

   메모리 접근에 있어서 동시 접근을 막는 것

 

* 유저 모드 동기화(User Mode Synchronize)

 : 동기화가 진행되는 과정에서 커널 코드가 실행되지 않는 동기화 기법

 

   (1) 크리티컬 섹션 기반의 동기화 → 메모리 접근 동기화

      - 전역으로 선언된 변수 하나의 접근방식을 동기화하는 것이 목적

      - 임계 영역(Critical Section) : 배타적 접근이 요구되는 공유 리소스에 접근하는 코드 블록

      - 블로킹 : 이 책에서 막다, 차단하다는 의미

 

   (2) 인터락 함수(Interlocked Family Of Function) 기반의 동기화 메모리 접근 동기화

      - 크리티컬 섹션 기반의 동기화 용도로 특화된 함수

      - 함수 내부적으로 한 순간에 하나의 쓰레드에 의해서만 실행되어 있도록 동기화(Atomic Access 보장)

      - InterlockedIncrement, InterlackedDecrement

 

* 커널 모드 동기화(Kernel Mode Synchronize)

 : 커널에서 제공하는 동기화 기능을 활용하는 방법

 

(1) 뮤텍스(Mutex) 기반의 동기화 → 메모리 접근 동기화

   - 세마포어 중에서 단순화된 세마포어(바이너리 세마포어를 의미)를 가리켜 뮤텍스라 함

   - CreateMutex 함수

HANDLE CreateMutexA(
  [in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
  [in]           BOOL                  bInitialOwner,
  [in, optional] LPCSTR                lpName
);


lpMutexAttributes

 : 보안 속성 지정
bInitialOwner

 : TRUE를 전달한 경우, 뮤텍스를 생성한 쓰레드가 먼저 기회를 얻는다

   FALSE를 전달한 경우, 먼저 차지하는 사람이 임자가 된다

lpName

 : 뮤텍스 이름

   이 인자에 NULL을 전달하면 이름없는 뮤텍스,

   이 인자에 이름을 전달하면 Named Mutex(이름있는 뮤텍스)라 표현한다

 

https://learn.microsoft.com/ko-kr/windows/win32/api/synchapi/nf-synchapi-createmutexa

 

CreateMutexA 함수(synchapi.h) - Win32 apps

명명되거나 명명되지 않은 뮤텍스 개체를 만들거나 엽니다. (ANSI)

learn.microsoft.com

 

(2) 세마포어(Semaphore) 기반의 동기화 → 메모리 접근 동기화

   - CreateSemaphore 함수

HANDLE CreateSemaphoreA(
  [in, optional] LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
  [in]           LONG                  lInitialCount,
  [in]           LONG                  lMaximumCount,
  [in, optional] LPCSTR                lpName
);

 

lpSemaphoreAttributes

 : 보안 속성 지정
lInitialCount

 : 세마포어 초기값
lMaximumCount

 : 세마포어 최대값
lpName

 : 세마포어 이름

   이 인자에 NULL을 전달하면 이름없는 세마포어,

   이 인자에 이름을 전달하면 이름있는 세마포어라 표현한다

 

https://learn.microsoft.com/ko-kr/windows/win32/api/winbase/nf-winbase-createsemaphorea

 

CreateSemaphoreA 함수(winbase.h) - Win32 apps

명명되거나 명명되지 않은 세마포 개체를 만들거나 엽니다. (CreateSemaphoreA)

learn.microsoft.com

 

(+) 이름있는 뮤텍스(Named Mutex) 기반의 프로세스간 동기화

   - CreateMutex, OpenMutex

 

(3) 이벤트(Event) 기반의 동기화 실행 순서 동기화

   - 생상자/소비자 모델

   - Signaled → Non-Signaled

   - Signaled 상태에서 Non-Signaled 상태로 직접 변경해줘야 한다면 수동 리셋 모드(Manual-Reset 모드)

     Non-Signaled 상태로 자동 변환되면, 자동 리셋 모드(Auto-Reset 모드)

   - CreateEvent 함수, ResetEvent 함수, SetEvent 함수

https://learn.microsoft.com/ko-kr/windows/win32/api/synchapi/nf-synchapi-createeventa

 

CreateEventA 함수(synchapi.h) - Win32 apps

명명되거나 명명되지 않은 이벤트 개체를 만들거나 엽니다. (ANSI)

learn.microsoft.com

https://learn.microsoft.com/ko-kr/windows/win32/api/synchapi/nf-synchapi-resetevent

 

ResetEvent 함수(synchapi.h) - Win32 apps

지정된 이벤트 개체를 부호 없는 상태로 설정합니다.

learn.microsoft.com

https://learn.microsoft.com/ko-kr/windows/win32/api/synchapi/nf-synchapi-setevent

 

SetEvent 함수(synchapi.h) - Win32 apps

지정된 이벤트 개체를 신호 상태로 설정합니다.

learn.microsoft.com

 

* volatile

   최적화를 수행하지 말라

 

* 이벤트(Event) + 뮤텍스(Mutex)

 

* 타이머(Waitable Timer) 기반의 동기화

   - 정해진 시간이 지나면 자동으로 Signaled 상태가 됨

   - 수동 리셋 타이머(Manual-Reset Timer), 주기적 타이머(Periodic-Timer)