동기화
-
윈도우 유저 모드 동기화 CRITICAL_SECTION개발/C·C++ 2019. 11. 4. 03:04
동기화 방법은 크게 유저 모드와 커널 모드가 있다. 커널 모드 동기화의 기능이 굳이 필요한 상황이 아니라면 유저 모드 동기화가 성능이 좋다. 응용 프로그램은 기본적으로 유저 모드에서 동작하기 때문에, 커널 모드 동기화를 사용하면 동기화할 때마다 커널에 접근해야 하므로 성능에 불이익이 생길 수밖에 없다. 유저 모드 동기화 방법은 주로 CRITICAL_SECTION(이하 CS)이 사용된다. 단순하게 변수의 정수값을 증감할 때는 Interlocked 계열 함수를 이용하면 되며 임계 영역을 동기화해야 하는 경우에는 CS로 동기화한다. CS로 동기화를 진행하기 위해서는 일단 CS 객체를 만들어야 한다. 초기화는 매개변수로 CS 객체의 포인터를 넣는 InitializeCriticalSection 함수를 사용하고 아..
-
뮤텍스와 WaitForSingleObject 함수개발/C·C++ 2019. 11. 1. 17:29
시스템 관련한 어느 책에서 뮤텍스 동기화를 설명하면서 WaitForSingleObject를 이용해 뮤텍스를 '획득'한다고 표현한다. CRITICAL_SECTION으로 유저 모드 동기화에도 거의 비슷한 표현을 하는데 잘 와닿지 않는다. 결과적으로는 획득이라는 표현은 아무 문제 없다고 반문한다면, 손가락이 언제나 달을 가리키고 있다고 해서 손가락을 보고 달이라고 할 수 없지 않은 것인가, 라고 대답하고 싶다. 뮤텍스를 생성하는 함수는 CreateMutex()로 세 개의 인자를 넣어줘야 한다. 그 중 두 번째 인자가 BOOL bInitialOwner로 TRUE를 넣으면 뮤텍스를 생성하는 스레드에서 해당 뮤텍스 사용하고 FALSE를 넣으면 어느 스레드가 되었던 먼저 사용하는 쪽이 임자다. 즉, TRUE에서는 뮤..