멀티 코어 시대인 만큼 요즘은 프로그램들을 평가할 때 멀티코어를 얼마나 잘 활용하나를 중요하게 따집니다. 그래서 프로그래밍 언어나 라이브러리에서 병렬 프로그래밍 지원을 하는 경우가 많습니다. C++11에서도 큰 특징 중의 하나가 thread 라이브러리 지원입니다.
VC의 경우는 현재 사용 중인
10에서는 MS 독자의 Concurrency
Runtime을 지원하였고, 이번 버전에서는 C++ 표준의
thread 라이브러리를 제공합니다(VC 전용으로 GPGPU 프로그래밍을 위해 AMP 라이브러리도 제공합니다).
C++11의 thread 라이브러리를
사용하면 기존에 복잡하고, 플랫폼 마다 다르게 기술해야 하는 스레드 프로그래밍을 쉽고, 플랫폼 독립적으로 구현할 수 있습니다.
앞으로 몇 번에 걸쳐서 C++11의 thread를 다룹니다. 내용이 어렵지 않으니 천천히 따라오시면 됩니다. 단 thread 라는 것이 무엇인지는 책이나 인터넷을 통해서 미리
공부하시기 바랍니다. 따로 thread에 대한 이론 설명을
하지 않겠습니다. ^^;
thread 생성하기
thread 라이브러리를 사용하기 위해서는 아래의 헤더 파일을
포함해야 합니다.
#include <thread>
thread 클래스의 생성자는 아래와 같습니다.
thread() _NOEXCEPT;
template<class Fn, class... Args>
explicit thread(Fn&& F, Args&&... A);
thread(thread&& Other)
_NOEXCEPT;
인자 중 Fn은 생성된 스레가 호출할 함수(애플리케이션에서 정의한), A는
Fn에 넘겨 줄 인수 리스트, Other는 기존의 스레드 오브젝트 입니다.
첫 번째 생성자는 thread 오브젝트는 만들지만 실제 스레드(OS에서 만들어진 스레드)와는 연결되지 않습니다.
두 번째 생성자는 실제 스레드와 연결된 오브젝트를 생성합니다. 만약
충분한 리소스가 없어서 스레드를 시작할 수 없다면 system_error 오브젝트에 resource_unavailable_try_again 에러코드로 예외를 발생시킵니다.
세 번째 생성자는 다른 thread 오브젝트를 넘겨 받아서 오브젝트를
생성합니다. 인자가 우측 값 참조 이므로 이후에 Other에
연결된 스레드는 Other과 연결이 끊어집니다.
아래의 예제를 통해서 스레드를 어떻게 사용하는지 보겠습니다.
< 예제. 1 >
#include <thread>
#include <iostream>
int main()
{
std::thread
Thread1( [] ()
{
for( int i = 0; i < 5; ++i )
{
std::cout
<< "Thread Num : " << i << std::endl;
}
} );
std::thread
Thread2;
Thread2
= std::thread( [] ()
{
for( int i = 10; i < 15; ++i )
{
std::cout
<< "Thread Num : " << i << std::endl;
}
} );
std::thread
Thread3 = std::thread( [] ( int nParam )
{
for( int i = 20; i < 25; ++i )
{
std::cout << "Thread Parameter :
" << nParam << std::endl;
}
},
4 );
getchar();
return
0;
}
< 결과 >

위 결과를 보면
스레드가 3개 만들어져서 실행된 것을 알 수 있습니다. 그런데
첫 번째 줄에 출력된 결과가 이상하죠? 이것은 공유 객체를 동기화 하지 않아서 발생한 것입니다. 이것은 뒤에 동기화 객체를 설명할 때 고쳐 보겠습니다^^;
ps: 위의 소스는 완벽한 것이 아닙니다. 아마 실행하면 에러가 발생할 것입니다. 이와 관련된 글은 뒤에 적을 글에서 설명할 예정이라서 이번 글의 코드에서는 일부러 조금 불완전한 코드를 사용했습니다.^^;;;
댓글