본문 바로가기
2_ 바삭바삭 프로그래밍/C and C++

C++ - boost 를 사용한 간단한 Thread 실행예제

by 준환이형님_ 2012. 9. 4.

오랜만에 쓰레드를 세팅하는데 많은 변동이 있었네요. 새로운 버전을 기준으로 다시 적습니다(2013. 8)

-----------------------------------------------------------------------------------------------------


아아- 콘솔 C 에서 스레드를 돌릴 수 있다니 정말 신나는 이야기 아닌가요? ㅋ


있다는 이야기는 들었지만 이상한 소문도 많고 세팅도 까다로운 것 같아. 사용하기는 왠지 조금 꺼려졌던 Boost.. 막상 써보니 Smart Point든 제공해주는 Array, 정규표현식 등. 유용한 도구들이 많은데 그 동안 왜 몰랐을까 하는 생각이 들더군요. 



부스트라이브러리(http://www.boost.org)란?


부스트 라이브러리는 프로그래머에게 검증된(또는 검증되고 있는) 가벼운 C++ 소스 라이브러리 입니다. 이 라이브러리는 어플리케이션 개발에 있어 다방면에 광범위하고 유용하게 사용되는 것을 목표로 합니다. 그리고 부스트는 표준 C++ 라이브러리(STL)과 매우 잘 동작하도록 설계되어 있습니다. 또한 부스트 라이브러리 사용에 대한 라이센스는 상업적이든 비상업적이든 무료로 사용할 수 있어 비용에 대한 부담이 없습니다. 



1. 먼저 Boost 를 다운 받은 뒤 설치해 줍니다. 

(버전 별로 경로와 실행방법이 달라질 수 있습니다)


 http://sourceforge.net/projects/boost/files/boost-binaries/


에서 최신버전(현재는 1.54.0 버젼) 클릭 >> 자신의 환경에 맞는 것으로 클릭 해야 하는데

 

자신에게 맞는 버젼으로 선택 / 다운로드

 

(예를들어 "boost_1_54_0-msvc-11.0-64"는 

1. 부스트 1.54버젼의

2. msvc - MS사의 Visual Studio

3. 11은 비주얼스튜디오 2012버젼 (참고 : 10은 2010버젼, 9가 2008버젼, 8이 2005버젼) 

4. 64비트 (비트수 확인방법 : 내컴퓨터 오른클릭 >> 속성

라는 의미) 






2. 경로추가. 저는 스튜디오 2010을 쓰는데 설치된 부스트 폴더와 연결해줍니다. 이전 버젼에 비해 로컬(보통 C드라이브)에 설치하는 경우 Local이란 패스가 하나 더 추가 되었네요


속성 - C/C++ - 일반 - 추가포함디렉터리 : "C:\local\boost_1_54_0"

속성 - 링커 - 추가 라이브러리 디렉터리  : "C:\local\boost_1_54_0\lib" (※ VS 2012 버젼은 : C:\local\boost_1_54_0\lib32-msvc-11.0)


라고 경로를 추가 해 줍니다.



3. 코딩코딩~ //함수 속에 While문이 있고, 스레드 아래 join 이 Run이라고 볼 수 있어요 


#include <iostream>


#include <boost/thread.hpp>


using namespace std;



class CSampleIO

{

public:


void TestThread()

{

while(true)                //일반적으로 while문을 빠져나가지 못한다고 생각하기 쉬운데 여기서는 그렇지 않음. Sleep으로 쉬는 동안 다른 스레드가 실행 될 수 있는 기회를 허용해 줌. 

{

cout<<"1 ";

boost::this_thread::sleep(boost::posix_time::millisec(500));

}

}


void TestThreadSecond(int num)

{

while(true)

{

cout<<num<<" ";

boost::this_thread::sleep(boost::posix_time::millisec(500));

}

}


void TestThreadThird(int num, int num2)

{

while(true)

{

cout<<num<<" ";

boost::this_thread::sleep(boost::posix_time::millisec(500));

}

}

};


int main()

{

//객체생성

CSampleIO io;


//스레드생성(인자는 계속 추가 시킬 수 있음)

boost::thread th1 = boost::thread( boost::bind(&CSampleIO::TestThread, &io)  );

boost::thread th2 = boost::thread( boost::bind(&CSampleIO::TestThreadSecond, &io, 2)  );

boost::thread th3 = boost::thread( boost::bind(&CSampleIO::TestThreadThird, &io, 3, NULL)  );

//join에서 해당 스레드가 시작 됨

th1.join();

th2.join();


return 0;

}


Sleep은 0.5초씩으로 동일 하지만 결과값은 1, 2, 3, 1, 2, 3 이 아닌 걸 확인 할 수 있죠. 각자 일하는 스레드니깐~