SW/C++

C++11 : Threading 라이브러리 ( 쓰레드 구현, 사용 방법 )

얇은생각 2019. 12. 23. 07:30
반응형

Thread 지원 라이브러리

C++에서의 쓰레딩 라이브러리 사용법에 초점을 맞추어 포스팅을 진행합니다. 특히, 쓰레드, 뮤텍스, 조건 변수 등을 활용해보도록 하겠습니다.

 

 

std::thread

c++11 이전의 멀티쓰레딩을 구현하기 위해서는 윈도우 쓰레드, POSIX 쓰레드를 사용했습니다. 그래서 OS 마다 구현을 달리해야만 했고, 불편함이 존재하였습니다.

결국, C++11 전까지는 표준 멀티 쓰레딩 라이브러리가 없었습니다. 리눅스와 유닉스 계열에서는 POSIX 쓰레드를 활용하였습니다. 윈도우는 따로 윈도우 쓰레드를 사용하였습니다. 

 

#include <iostream>
#include <string>
#include <thread>

using namespace std;

void PrintMessage(const string& message)
{
    cout << message << endl;
}

int main()
{
    thread thread(PrintMessage, "Message from a child thread.");
    
    PrintMessage("Message from a main thread");
    
    
    return 0;
}

 

생성자는 이동 생성자가 있으며, 복사 생성자는 불가능하게 구현되어있습니다. 위 코드는 좋은 코드는 아닙니다. 쓰레드가 동작하는 동안, 메인 프로세스가 동작이 함께하여, 원하는 결과가 나오지 않습니다. 

 

이유는 메인과 자식 쓰레드의 메세지가 동시에 출력되기 때문입니다. 자식 쓰레드가 끝나기 전에 메인 쓰레드가 끝이 나서, 에러가 날 수 있습니다. 따라서 자식 쓰레드가 끝날 떄 까지 기다리도록 코드를 구현 할 수 도 있습니다.

 

#include <iostream>
#include <string>
#include <thread>

using namespace std;

void PrintMessage(const string& message)
{
    cout << message << endl;
}

int main()
{
    thread thread(PrintMessage, "Message from a child thread.");
    
    PrintMessage("Message from a main thread.");
    
    thread.join();
    
    return 0;
}

 

Message from a main thread.

Message from a child thread.    

 

이제 위와 같이 잘 나오는 것을 확인 할 수 있습니다.

 

 

 

void join(); 

쓰레드 개체가 끝날 떄까지 현재 쓰레드를 멈춥니다. 이 함수를 호출 한 후 쓰레드 개체를 안전하게 소멸시킬 수 있습니다. 이러한 함수를 활용하면, 좀 더 안정적으로 쓰레드 프로그래밍을 구현할 수 있습니다. 

반응형