오랜만에 쓰레드를 세팅하는데 많은 변동이 있었네요. 새로운 버전을 기준으로 다시 적습니다(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 이 아닌 걸 확인 할 수 있죠. 각자 일하는 스레드니깐~ 





신고
Creative Commons License
Creative Commons License
Posted by 준환이형님

댓글을 달아 주세요

  1. 동우기 2014.07.24 14:07 신고 Address Modify/Delete Reply

    잘 보고 갑니다~

    한 가지 뱀발을 달자면, join()은 그 Thread의 실행이 끝날때까지
    main함수가 이후의 함수를 실행하지 않도록 대기하게 만드는 것입니다.

    위의 예제 코드에서

    th1.join();
    th2.join();

    은 해당 스레드가 실행되는 부분이 아니라, 이미 스레드는 실행되고 있으며 스레드가 끝나기를 기다리는 것이죠.
    윗 부분에서 th2.join(); 은 필요없는 부분이고, 위 두줄을 그냥 getchar(); 로 바꾸기만 해도
    같은 행동을 반복하게 됩니다.

  2. seo 2014.10.06 21:36 신고 Address Modify/Delete Reply

    저는 헤더를 include 하기만 해도 링크가 걸리지 않는다고 에러가 나는데 왜 그런지 알수 있을까요?

  3. 랑재 2016.06.23 18:10 신고 Address Modify/Delete Reply

    동우기님 리플처럼 조인 은 단순 기다리는 게 맞는 것 같네요,
    그리고 os 환경에따라 cout이 바로 안보이는 경우가 있는데, cout.flush함수 사용시 해결할 수 있긴합니다.

    그리고 위에 질문은 인클루드는 boost의 헤더폴더(include폴더)를 컴파일시에 명시해줘야하고
    linker 패스도 (lib폴더)를 추가해주셔야 됩니다.

티스토리 툴바