쓰레드풀에서 흔하게 사용되는 방법이 워커 쓰레드를 N개 생성하여 놓고 공유하는 작업 큐에서 데이터를 받아와 워커 쓰레드에서 실행하는 방법입니다. 이 때 작업 큐가 비었을 때 워커 쓰레드를 재워주는 처리를 해주지 않으면 CPU 사용량이 올라가게 됩니다. sleep을 해주는 것도 재운 시간에 작업 큐에 데이터가 들어왔다면 그 만큼 워커 쓰레드에서 늦게 실행하게 되어 재우는 시간도 민감하게 설정하여야 합니다.
이 때 사용할 수 있는 방법이 작업 큐에 조건 락(conditional lock)을 사용하는 것입니다. 이 방법을 바탕으로 작업 큐가 비어 있을 때만 워커 쓰레드를 재우고 작업 큐에 데이터가 들어왔을 때는 깨울 수 있습니다. 이 방법은 워커 쓰레드의 사용성은 높이면서 CPU 사용량을 줄이는 방법입니다. 조건 락은 C++ 11이상이라면 OS API 뿐만 아니라 C++ 표준 라이브러리를 사용할 수 있습니다.
쓰레드 풀에서 사용할 만한 작업 큐 예제로 [c++ 예제] 멀티스레드에 안전한 notify_queue 클래스라는 글의 소스에 있는 NotifyQueue 클래스가 좋은거 같습니다. 이 분의 글은 큐와 함께 생산자와 소비자 패턴을 설명하고 있습니다. 이 예제 소스는 읽기-쓰기 락(read-write lock)이 가능한 shared_mutex까지 사용하여 성능에도 민감하게 작성된거 같습니다.
참고로 이 분 예제 보시려면 C++ 이상에서 추가된 락 관련 클래스 많이 이해하거나 찾아보아야 합니다. 멀티 쓰레드에 익숙하지 않다면 락 관련 클래스가 사용되는 일반적인 상황도 이론적으로 같이 공부하시는 것이 좋을거 같습니다.
'서버 프로그래밍' 카테고리의 다른 글
[서평] 가상 면접 사례로 배우는 대규모 시스템 설계 기초 2 (1) | 2024.01.25 |
---|---|
[서평] 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (0) | 2023.12.19 |
성능 향상하기: IO 관련 처리 vs CPU 관련 처리 (0) | 2021.11.03 |
폴(Poll) 방식의 네트워크 처리 구현 (0) | 2021.11.02 |
boost asio io_service(io_context)의 poll과 run의 활용 (0) | 2021.10.27 |
boost asio io_service(io_context)의 이해 및 활용 (0) | 2021.10.26 |
[서평, 소개] 클라우드 디자인 패턴(Cloud Design Patterns) (0) | 2017.04.08 |
[서평, 소개] NoSQL (0) | 2017.04.01 |