운영체제

[게임 프로그래머 입문 올인원] 멀티쓰레드 프로그래밍 : 이벤트와 조건 변수

순정법사 2024.12.04

A. 이벤트와 조건 변수

1. 이벤트 (승무원부탁)

a. 사용하게 되는 이유

매니저에 접근할때 락을걸로 작업하면 됨

 

스레드를 이리저리 배치해서 운영하면 

생성, 소모에 따라서 배치를 하게 됨

 

 

먼저 mutex 생성

일감은 queue에 넣어주기

 

생성자에선 데이터를 넣어주고

 

sleep_for는 얼마만큼 쉬어야 하는지를 나타냄

 

 

반대로 producer와 반대로 일함

정보가 들어있으면, 꺼내서 출력하기

 

 

나중엔 위 방식에서 네트워크 통신을 잡아서 넣어주게 됨

 

위 방식에서 아쉬운건 락을 걸고 어떤 행위를 하고 있음 

데이터가 없어도 스핀락처럼 계속 우회하고 있음

 

👉 해결방법은 스핀락, 위에서 사용한 sleep_for, 승무원한테 부탁하기

 

승무원한테 부탁하는건 이벤트를 활용하는 것임

 

b. 이벤트 :: 커널 오브젝트

정수, 정수가 특정 커널 오브젝트를 나타냄

 

🌟 커널 오브젝트 ::  운영체제가 관리하는 오브젝트 

 

종류 :: 사용되는것 . 빨/파란불

 

사용하는 방법은 아래와 같음

 

 

커널 오브젝트는 다른 프로그램에서도 동기화해서 만들수도 있음 (참고만)

 

closehandle로 닫아주기

 

 

프로듀서쪽에서 파란불 켜주기

 

트리거를 잡는 코드

 

일감이 있을 확률에만 깨어나서 작동을 하게 됨

 

다시 빨간불로 켤지는 ResetEvent로 하기

 

이렇게 스핀락을 이벤트처리로 해버리면 불필요한걸 예방하게 되고

cpu부하가 낮아지게 된다!

 

💥 이벤트의 단점

1) 비용 문제가 있음 (너무 많이 사용하게 되면 안됨)

2) 1:1 방식으로 생성,소비가 아닌 1:n 방식으로 되면, 락에 걸려서 다른 방식으로 소비될 수 없음 

3) 사실 작업할 때 굳이 이벤트까지 갈 필요가 없어짐

 

 

2. 조건 변수

a. condition_variable :: 유저레벨 오브젝트

 

이것도 이벤트와 비슷하게 어떤 상황이 되는걸 기다린다

 

one은 1개만 깨우고 all은 모두 깨우기

 

람다식으로 원하는 조건을 넣어주기

 

조건에 만족하면~ 아래를 실행, 아니면 락을 풀고 잠들게 됨 (유니크 락 사용이유)

 




출처 : https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%9E%85%EB%AC%B8-%EC%98%AC%EC%9D%B8%EC%9B%90-rookiss#curriculum

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버

Rookiss | 어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로

www.inflearn.com