14. 동기화 프리미티브 비교: mutex·semaphore·condition variable·barrier·latch·event·spinlock

난이도 중 해설 보기 →
문제

문제 14 — 동기화 프리미티브 비교: mutex·semaphore·condition variable·barrier·latch·event·spinlock

게임 서버의 틱 루프·잡 시스템·연결 관리에서 여러 스레드를 조율할 때, "무엇으로 동기화할 것인가"를 상황에 맞게 골라야 한다. 다음을 설명하라.

  1. 상호배제(mutual exclusion)mutex(비재귀 vs 재귀), SpinLock, ReaderWriterLock(공유/배타)의 차이를 설명하라. 각각 임계구역이 짧을 때/길 때, 읽기 우세일 때 무엇이 맞는가? 스핀락이 유리한 조건과 위험(선점된 락 소유자 대기, 우선순위 역전)을 논하라.

  2. 카운팅 세마포어 vs 뮤텍스 — 세마포어(허가 N개)와 뮤텍스가 개념적으로 어떻게 다른가? "소유권(ownership)" 개념이 있는 쪽은 어디이며, 그 차이가 왜 중요한가(누가 풀 수 있는가, 재귀·우선순위 상속 가능 여부)? 세마포어가 자연스러운 예(연결 수 제한·풀 크기·생산자-소비자 자리 수)를 들라.

  3. 조건 변수(condition variable) — cv 가 "락 + 술어(predicate) 대기"와 어떻게 결합되는지 설명하라. 왜 항상 락을 쥔 채 while(!술어) wait 로 재검사해야 하는가(가짜 깨어남·깨어남 유실)? notify_one vs notify_all 선택 기준은?

  4. 일회성/집결 도구 — barrier, latch, eventCountDownLatch(한 번 0이 되면 열림)와 재사용 가능한 barrier(모든 참가자가 모이면 함께 통과)의 차이, ManualResetEvent/AutoResetEvent(수동/자동 리셋)의 신호 의미를 설명하라. 틱 루프에서 "모든 워커가 이 단계를 끝낼 때까지 대기"에 무엇이 맞는가?

  5. 선택 기준과 함정 — 위 도구들을 (a) 대기 시간(짧음/김), (b) 소유권 필요 여부, (c) 일회성/반복, (d) 커널 전이 비용 관점에서 정리하라. 그리고 스핀락으로 블로킹 I/O 를 감싸거나, 세마포어 허가를 예외 경로에서 반납하지 않거나, cv 를 락 없이 신호하는 등 대표적 오용을 지적하라. C++(std::mutex/std::counting_semaphore/std::condition_variable/std::latch/std::barrier)와 C#(lock/SemaphoreSlim/Monitor/ManualResetEventSlim/Barrier)의 대응도 짝지어라.

답안 작성
내 답안 · 자동 저장

직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.