일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 개발
- 넥스트에디션 2호점
- 시스템 프로그래밍
- 이스케이퍼스 2호점
- 홍대 덤앤더머
- C++ 자료구조
- 넥스트에디션
- C#
- 후기
- 윈도우 프로그래밍
- 꽃길
- 방탈출 후기
- 정렬 알고리즘
- 방탈출 추천
- 이스케이퍼스
- Android
- 추천
- 2021 방탈출 추천
- 방탈출 리뷰
- 홍대
- 필활
- 강남 방탈출
- C 자료구조
- PC VR
- 유니티
- 홍대 방탈출 추천
- Unity
- 방탈출
- 공포 방탈출
- 홍대 방탈출
- Today
- Total
행복한 연어의 이야기
(윈도우 시스템) 14. 쓰레드 동기화 기법 2 (실행순서의 동기화) 본문
1. 실행순서에 있어서의 동기화
메모리에 접근하는 쓰레드의 실행순서를 동기화한다.
즉 실행순서 동기화는 메모리 접근 동기화를 포함하는 개념이다.
이벤트 기반의 동기화 (커널 모드 동기화)
쓰레드나 프로세스 커널 오브젝트의 경우 처음에 Non-Signaled 상태로 생성되며
종료될 경우 Signaled 상태로 자동으로 변경된다.
하지만 이벤트 커널 오브젝트는 자동으로 Signaled 상태가 되지 않아 수동으로 변경 해주어야 한다.
WaitForSingleObject 함수를 호출한 쓰레드(뮤텍스 등)의 경우 함수 호출 완료 후 Signaled 상태가 되는데
이벤트 커널 오브젝트는 2번째 인자 bManualReset 로 자동으로 Signaled 상태로 변경이 될지 (이하 자동 모드),
계속 Non-Signaled (이하 수동 모드)로 남아있을지 결정 할 수 있다.
수동모드 이벤트(UnManual - Reset Event)일 경우 프로그래머가 모드를 바꿔줘야 하는데
ResetEvent 함수와 SetEvent 함수를 사용한다.
이를 통해 수동모드 이벤트 커널 오브젝트의 상태 변화를 정할 수 있어 특정 지점에 대해 순서를 정할 수 있다.
자동 모드 이벤트 = 기다리고 있던 쓰레드 중에서 하나를 깨우고 종료되면 기다리고 있던 다른 쓰레드를 깨우는 방식
수동 모드 이벤트 = 기다리고 있는 쓰레드를 모두 깨우는 방식
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTE lpMutexAttribute, //보안속성 설정
BOOL bManualReset, //수동리셋 모드인지, 자동리셋모드인지
BOOL bInitialState, //생성 직후 Signaled 상태, Non-Signaled 상태 결정 여부
LPCTSTR lpName
);
BOOL ResetEvent(
HANDLE hEvent //Non-Signaled 상태로 만들 이벤트 커널 오브젝트 핸들
);
BOOL SetEvent(
HANDLE hEvent //Signaled 상태로 만들 이벤트 커널 오브젝트 핸들
);
//============================================= 아래는 진행 순서
CreateEvent 함수로 이벤트 생성 (수동 모드 - Non-Singaled 상태)
2번 쓰레드에서 WaitForSingleObject 함수로 이벤트가 Singaled 상태가 될때까지 대기
1번 쓰레드에서 원하는 시점에서 SetEvent 함수 호출, 2번 쓰레드 실행
WaitForSingleObject 함수로 2번 쓰레드 종료 대기
원하는 지점까지 1번 쓰레드 실행 -> 2번 쓰레드 실행 완료 후 -> 1번 쓰레드 실행
혹은 아래와 같은 방법으로도 사용가능하다.
//============================================= 아래는 진행 순서
CreateEvent 함수로 이벤트 생성 (수동 모드 - Non-Singaled 상태)
2번 3번 쓰레드에서 WaitForSingleObject 함수로 이벤트가 Singaled 상태가 될때까지 대기
1번 쓰레드에서 원하는 시점에서 SetEvent 함수 호출, 2번 3번 쓰레드 실행
WaitForMultipleObject 로 2개 쓰래드 종료 시점까지 대기
원하는 지점까지 1번 쓰레드 실행 -> 2번 3번 쓰레드 실행 완료 후 -> 1번 쓰레드 실행
2번째 2개 이상의 쓰레드를 원하는 지점에서 실행하는 내용을 작성 할 수 있다.
이렇게 실행되는 쓰레드또한 메모리 접근 관련 동기화가 있기에 13장에서 설명한
뮤텍스 동기화 기법 등 동기화 기법들을 조합해서 사용하면 해결이 될 수 있다.
2. 타이머 기반 동기화
커널오브젝트는 종류에 따라 자동으로 Signaled 상태 Non-Signaled 상태가 변경되기도 하고
함수호출을 통해 상태가 변경되기도 했다.
지금 소개할 타이머 기반 동기화 오브젝트는 정해진 시간이 지나면
자동으로 Signaled 상태가 되는 특성을 지닌다.
수동 리셋 타이머
정해진 시각에 울리는 타이머
주기적 타이머
정해진 시각에 울린 후 주기적으로 추가로 울리도록 할 수 있는 타이머
HANDLE CreateWaitableTimer(
LPSECURITY_ATTRIBUTE lpMutexAttribute, //보안속성 설정
BOOL bManualReset, //수동리셋 모드인지, 자동리셋모드인지
LPCTSTR lpTimerName
);
BOOL SetWaitableTimer(
HANDLE hTimer, //타이머 커널 오브젝트 핸들
const LARGE_INTEGER* pDueTime, //정확한 시간 +값 / 지금부터 x초 후 -x값
LONG lPeriord, //최소 알람 후 주기적으로 울릴 시간 간격
PTIMERAPCROUTINE pfnCompletionRoutine,
LPVOID lpArgToCompletionRoutine,
BOOL fResume
);
BOOL CancelWaitableTimer(
HANDLE hTimer //알람을 해제할 타이머 커널 오브젝트 핸들
);
//============================================= 아래는 진행 순서
CreateWaitableTimer 함수로 타이머 생성
SetWaitableTimer 함수로 시간 간격 설정
WaitForSingleObject 함수로 타이머가 Signaled 상태 되기를 대기
지정한 시간이 지나면 WaitForSingleObject 아래쪽 부분 코드 내용 실행
알람을 해제하고 싶다면 CancelWaitableTimer 함수 호출
CloseHandle 함수로 리소스 해제
알고 넘어가야할 것
1. 실행순서 동기화와 이벤트 오브젝트
2. 타이머 기반 동기화
3. 이벤트 더하기 뮤텍스
'윤성우 저자'님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍' 책을 보고 정리한 내용입니다.
'IT > 윈도우 시스템 프로그래밍' 카테고리의 다른 글
(윈도우 시스템) 17. 구조적 예외처리(SEH) 기법 (0) | 2021.08.23 |
---|---|
(윈도우 시스템) 16. 컴퓨터 구조 네번째 (0) | 2021.08.20 |
(윈도우 시스템) 13. 쓰레드 동기화 기법 1 (메모리 접근에 대한 동기화) (0) | 2021.08.16 |
(윈도우 시스템) 12. 쓰레드의 생성과 소멸 (0) | 2021.08.13 |
(윈도우 시스템) 11. 쓰레드의 이해 (0) | 2021.08.11 |