이전에 프로세스와 쓰레드에 대해 다룬 적이 있다.
오늘 다뤄볼 내용은 쓰레드가 C++ 에서 어떻게 사용하는지에 대해 좀 알아봐야겠다.
이것도 사실 모 기업 필기 테스트에서 나왔는데, Thread를 AfxBeginthread를 써서 만들어 본 적은 있지만, Modern C++로 사용해 본 적이 없어서 쓰레드 코드에 대한 이해가 1도 없는 채로 문제를 풀었다.
우선 C++ 에서 Thread는 std::thread를 보면 될 것 같다. 오늘은 간단하게 쓰레드를 어떻게 선언하고 어떻게 동작시키는지에 대해 알아보자.
선언 자체는 간단하다.
다음과 같이 선언하면 된다. Func1과 Func2 모두 k를 받아서 더하면서 출력하는 코드이다. 실행 결과를 보면 다음과 같다.
보다시피 순서가 지 꼴리는대로 진행된다. 분명 나는 t1, t2를 순서로 선언했지만, 실행결과는 이게 뭐지 싶은 순서로 진행되었다. 이래서 멀티쓰레드 프로그래밍이 어려운 것이다. 그리고, t1,t2를 선언만 하고 넘어갈 경우 런타임에러가 발생한다. 그러므로, join()함수를 이용하여 쓰레드의 실행이 종료될 때까지 기다려 줄 필요가 있다.
join함수? - 해당 쓰레드가 실행을 종료했을 경우 리턴한다. 즉, join함수는 t1이 종료되기 전까지는 리턴하지 않는다.
detach함수? - 해당 쓰레드를 실행시키고 아무 신경쓰지 않는다. 즉, 쓰레드가 백그라운드로 들어가고, 프로세스가 종료될 때 해당 프로세스 안에서 돌아가는 쓰레드들은 종료 여부와 상관없이 자동으로 종료된다. main함수가 종료되면 쓰레드는 자동으로 종료되버린다.
두개의 함수는 꼭 알아두고, 이제 추가사항에 대해서 포스팅은 다음번에 할 예정이다.
멀티쓰레드 프로그래밍
1. 쓰레드의 실행순서를 제어해주어야 한다.
2. 공유변수의 접근에 있어 조심할 필요가 있다.
3. Dead Lock에 걸릴 수 있으니 조심해야한다.
위의 3가지 문제를 위해서 Mutex, Critical Section, Semaphore와 같은 동기화객체를 사용하여 제어한다.
추석이라 블로그에 포스팅할 시간이 조금 부족하다. 하지만 앞으로 면접이나 필기테스트에 나올 확률이 높기 때문에 꼭 정리하고 넘어갈 생각이다. 내일이라도 해야지..
-- 즐거운 추석 되세요!
'Modern C++' 카테고리의 다른 글
[C++] Universal Reference (0) | 2021.09.27 |
---|---|
[C++] R Value 참조와 Move Semantics (0) | 2021.09.11 |
[C++] Priority Queue - 우선순위 큐 (0) | 2021.08.19 |
[C++] Iterator (0) | 2021.08.16 |
[C++] 상속 (0) | 2021.08.15 |