멀티 코어 시대인 만큼 요즘은 프로그램들을 평가할 때 멀티코어를 얼마나 잘 활용하나를 중요하게 따집니다. 그래서 프로그래밍 언어나 라이브러리에서 병렬 프로그래밍 지원을 하는 경우가 많습니다. 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: 위의 소스는 완벽한 것이 아닙니다. 아마 실행하면 에러가 발생할 것입니다. 이와 관련된 글은 뒤에 적을 글에서 설명할 예정이라서 이번 글의 코드에서는 일부러 조금 불완전한 코드를 사용했습니다.^^;;;


by 흥배 2012. 11. 12. 09:00
  • hkskyp 2012.11.12 15:13 ADDR EDIT/DEL REPLY

    이번 코드를 실행 시켜보니까 abort()가 발생하던데요.
    그래서 저는 join()를 추가 했습니다. 혹시 abort()가 발생하지 않았나요?

    Thread1.join();
    Thread2.join();
    Thread3.join();

    • 흥배 2012.11.12 16:23 신고 EDIT/DEL

      네 에러가 발생하는 것이 맞습니다. 관련된 글을 뒤에 올릴 예정이라서 따로 언급하지 않았는데 오해를 줄 수 있겠네요. 글 수정하겠습니다.^^;

  • 저.. 2013.12.11 16:33 ADDR EDIT/DEL REPLY

    #include <thread>에 빨간줄 뜨면서 파일 소스를 열 수 없다고 나오는데요...왜그럴까요ㅠㅠㅠ??

    • 흥배 2013.12.12 14:21 신고 EDIT/DEL

      혹시 컴파일도 안되나요? 컴파일은 되는데 그런경우라면 보통 컴퓨터 성능이 VS가 원하는 것보다 낮아서 실시간으로 체크를 못해서 나타나는 현상입니다. VS2012 버전 이상에서는 thread 사용할 수 있습니다.

  • 머드게임 개발중... 2014.11.11 20:17 ADDR EDIT/DEL REPLY

    VS2010에서 thread 쓰려니까 진짜 죽겠더군요.
    결국 VS2013깔고 thread 공부중입니다.
    설명이 잘돼있네요 굿굿

    • 흥배 2014.11.11 23:15 신고 EDIT/DEL

      ㅎㅎ 즐거운 프로그래밍 하세요^^