포스팅 계기
나의 티스토리를 자주 방문하는 독자가 있는지는 잘 모르겠지만, 최근에 Thread의 개념과 자체적으로 Custom 해서 사용하는 Thread Lib을 포스팅한 적이 있다. 해당 포스팅에서 멀티 스레드에 관한 이야기를 나중에 작성하겠다고 약속을 하였기 때문에 글을 쓰게 되었다. 또한, 멀티 스레드라는 것은 개념을 이해한다고 하여도 실무에서 겪는 여러 문제들이 있는데 이러한 문제들을 공유하면서 설계 시 고려하여 구현하는 개발자들이 늘어났으면 좋겠다는 바람도 있다.
https://kiswiss77477.tistory.com/9
Thread Lib(Windows) - C ++
포스팅 계기 오늘은 개발자라면 다들 이해를 하고 있어야 하기도 하지만 제대로 이해하지 못하고 있는 사람도 많은 Thread에 관해서 설명도 하고 Windows API를 이용하여 만든 라이브러리로 공유할
kiswiss77477.tistory.com
멀티 스레드(Multi Thread) 란?
멀티 스레드란 무엇일까? 직역하면 다중스레드이다. 말 그대로 한 프로세스 내에서 하나의 스레드가 아닌 2개 이상의 스레드가 동시에 작업을 진행하는 것을 의미한. 그러면 프로세스를 여러 개 사용하면 되는 것이 아닌가? 왜 굳이 멀티스레드를 활용하여 구현을 하는가?라는 의문이 들 수 있다. 프로세스는 각자 자신만의 독립적인 주소공간을 가지기 때문에 A프로세스에서 B프로세스 주소공간을 참조하는 것이 불가능하다. 프로세스 간 자원 공유를 할 수 있는 방법은 크게 공유 메모리와 메시지 전달방식이 있는데 해당 방법은 나중에 시간이 나게 되면 포스팅하도록 하겠다. ( 앞으로 쓸 글이 많아서 좋기도 하고 좋지 않은 것 같기도 하다..?)
멀티 스레드(Multi Thread) 추가 비용
프로세스 간에는 이러한 문제가 있기 때문에, 같은 주소공간에서 작업을 분할해서 진행을 하기 위해서는 멀티스레드로 작업할 수밖에 없다. 물론 성능이 중요하지 않거나, 병렬적으로 처리할 필요가 없는 경우에는 고려할 필요가 없다. 하지만 대표적인 예로 주로 서버에서 통신을 주고받을 때에는 하나의 스레드만으로는 Client로부터 요청받은 작업을 하기에 무리가 있다. 이럴 경우에는 멀티스레드를 통해 여러 가지 작업을 동시에 진행할 수 있어야 한다.
하지만, 무조건적으로 스레드가 많으면 좋을까?라는 생각도 해야 한다. 멀티스레드를 하게 되면 추가적으로 발생하는 시간들이 있다. 공유하는 자원에 접근하여 read/write를 할 때 lock/unlock을 통해 동시에 read/write를 할 수 없도록 하는데 이때 여러 스레드가 자주 공유자원에 접근하는 상황이라면 지연 시간이 많이 발생하게 된다. 또한, 콘텍스트 스위칭 오버헤드도 고려를 해야 한다. 콘텍스트 스위칭 오버헤드란 여러 프로세스 or 스레드를 사용중일 때 CPU가 현재 프로세스나 스레드의 상태를 저장하고 다른 프로세스나 스레드로 전활 될 때 발생한다. 콘텍스트 스위칭이 자주 이루어지게 되면 성능에 영향을 미치게 된다.
마지막으로 스레드를 많이 생성할 경우 리소스 낭비가 이루어질 수 있다. 스레드를 많이 할당해 놓고 사용한다고 한들 매 시간마다 그 스레드가 모두 동작을 하는 것이 아니라 대기하는 시간이 존재할 텐데 아무것도 하지 않고 있다면 문제가 될 수 있다. 이와 관련하여 많은 책들에서 제시하는 적정 스레드 개수 산정방식은 아래와 같다.
- 적정 스레드 개수 = CPU 수 * ( 1 + 대기시간/작업시간 )
실무에서 겪었던 문제들
- 스마트포인터 : 동적으로 할당받은 객체를 자동으로 해제하며, 동일한 객체를 여러 곳에서 사용할 수 있는 방법입니다. 예를 들어 A 로직에서 *P를 사용하고, B 로직에서도 *P를 사용할 수 있다. 다만 사용 완료 후 자원을 반납할 때 현재 사용 중인 개수가 0인 경우에는 자동으로 메모리를 해제하여 메모리 누수를 방지하는 기능이다. 편리한 기능이지만, 멀티스레드에서 스마트포인터 사용 개수 Check가 제대로 이루어지지 않는다면, 누군가가 사용할 때 해제가 되는 문제가 발생할 수 있다.
- 종료 조건 설정 : 동시에 하나의 작업을 두 스레드 이상에서 진행을 할 경우 서로 종료가 되는 조건 설정도 잘 이루어져야 한다. 혹여나 종료 조건을 Check 하는 Condition 설정이 제대로 이루어지지 않는다면 다른 스레드가 종료되었는지 or 아직 진행되었는지를 알지 못하고 싱글 스레드로 동작하는 것과 별 다를 수 없는 현상이 발생할 수 있다.
※ 오늘 포스팅한 내용이 독자들에게 조금이나마 도움이 되었으면 좋겠습니다. 글을 읽다가 잘 모르는 부분이 있는 경우 댓글 남겨주시면 답변할 수 있도록 하겠습니다. 또한, 제가 잘못 알고 있는 지식이 있다면 지적 부탁드리겠습니다.
'C++ 개발이야기' 카테고리의 다른 글
C++ 개발자의 반성 (2) | 2025.04.16 |
---|---|
실무에서 경험한 C++ 멀티스레딩과 스마트 포인터 문제 및 해결 방법 (0) | 2025.03.05 |
C++ 개발자로서 성장하는 법: 나의 경험과 팁 (0) | 2025.03.05 |
C++ 나만의 코딩 습관 (2) | 2024.10.07 |
Thread Lib(Windows) - C ++ (0) | 2024.01.05 |