리소스에 대한 액세스를 동기화하려면 대기 함수 중 하나에서 동기화 개체 중 하나를 사용합니다. 동기화 개체의 상태는 신호 상태이거나 비신호 상태입니다. 대기 함수를 사용하면 지정된 서명되지 않은 개체가 신호 상태로 설정될 때까지 스레드가 자체 실행을 차단할 수 있습니다. 자세한 내용은 프로세스 간 동기화를 참조하세요.
올바른 동기화 기본 형식 선택
| 원시적인 | Scope | Performance | 재진입 | 사용 시기 |
|---|---|---|---|---|
| SRW(슬림 판독기/기록기) 잠금 | 단일 프로세스 | 빠름(일반적으로 사용자 모드이며, 경합 시 커널 모드로 들어갈 수 있음) | No | 최신 코드에서 읽기 작업이 많은 워크로드에 대한 기본 선택입니다. 가장 작은 메모리 공간(포인터 크기)입니다. |
| 중요 섹션 | 단일 프로세스 | 빠름(스핀 후 커널 대기) | 예 | 한 프로세스 내에서 재진입/재귀 잠금이 필요한 경우에 사용합니다. SRW보다 약간 큼. |
| 뮤텍스 | 교차 프로세스(명명됨) | 느림 (항상 커널 개체) | 예 | 명명된 뮤텍스를 통해 프로세스 간 동기화에 필요합니다.
WaitForMultipleObjects와 함께 사용해도 유용합니다. |
| 세마포어 | 교차 프로세스(명명됨) | 커널 개체 | N/A | 리소스 풀에 대한 동시 액세스를 제한합니다(예: N 항목의 연결 풀). |
| Event | 교차 프로세스(명명됨) | 커널 개체 | N/A | 스레드/프로세스 간의 신호. 데이터 보호가 아닌 "발생한 일" 알림에 사용합니다. |
C++ std::mutex / std::shared_mutex |
단일 프로세스 | 구현 정의 | No | 이식 가능한 C++ 코드 및 RAII에 선호됩니다. Win32 대기 API 또는 프로세스 간 동기화가 필요하지 않은 경우에 사용합니다. |
메모
SRW 잠금 및 중요 섹션: 재귀 잠금이 필요하지 않은 새 코드의 경우 SRW 잠금(AcquireSRWLockExclusive/AcquireSRWLockShared)을 선호합니다. 더 작고 빠르며 판독기/작성기 의미 체계를 지원합니다. 동일한 스레드에서 재진입(재귀) 획득이 필요한 경우에도 중요한 섹션이 적합합니다.
Important
일반적인 실수: 임계 영역 또는 SRW 잠금으로 충분한 경우 프로세스 내 동기화에 뮤텍스를 사용하는 것. 뮤텍스에는 항상 커널 모드 전환이 포함되므로 단일 프로세스 내에서 빈도가 높은 작업의 경우 훨씬 느려집니다.
다른 동기화 메커니즘은 다음과 같습니다.
- 겹치는 입력 및 출력
- 비동기 프로시저 호출
- 중요한 섹션 개체
- 조건 변수
- 슬림 판독기/기록기 잠금
- 일회성 초기화
- 인터록된 변수 접근
- 상호 잠금된 단일 연결 리스트
- 타이머 큐
- MemoryBarrier 매크로
동기화에 대한 자세한 내용은 동기화 및 다중 프로세서 문제를 참조하세요.