본문 바로가기
Tools for Dev

boost::thread

by leanu 2008. 12. 22.
What is boost thread
----------------------------------------------------------------------------------
   쓰레드와 프로세스의 개념에 대해 알고싶으면 이곳을 참조하라 (조인시위키). 쓰레드는 각 플랫폼마다 조금씩 다르게 설정되어 있어서, 여러 플랫폼의 스레드를 지원하는 프로그램을 짤 경우 신경쓸 부분이 많아진다. boost thread는 이런 신경쓸 부분들을 줄여주고자 만든 thread관련 멀티플랫폼 라이브러리이다.



Conditions in boost thread
----------------------------------------------------------------------------------
  1. boost thread에 연동시킬 함수는 인자가 없는 함수여야 하는데, 만약 인자가 있는 함수를 써야 하는 경우 boost::bind를 사용하여 인자없는 함수로 변환후 사용 가능하다.
  2. boost thread object는 복사는 안되고 단지 이동만 가능하다.
    (예)
    boost::thread first_thread();
        
    void func()
    {
         boost::thread move_test_thread = make_thread();
         some_thread.join();
    }


How to use boost thread
----------------------------------------------------------------------------------

  • 헤더 : #include <boost/thread.hpp>
  • 선언
    • 쓰레드함수가 외부에 있을때 ( func1 은 void형 )
        : boost::thread threadVar1( &func1 );

    • 쓰레드함수가 클래스의 멤버 평선일때
        : boost::thread threadVar2( boost::bind(&ClassName::func2, this) ); 

      boost::bind는 함수의 인자의 갯수변화를 줄때 쓰이는데, 여기서 thread 생성시 필요한 함수는 인자가 void여야 한다. 우리가 맴버함수안에서 "인자가 void인 다른 맴버함수"를 부를때는 선언한 형식대로 선언해주면 된다고 생각하고 있는데, 모든 맴버함수는 가장 첫번째 인자 this 를 생략하고 있음을 명심해야 한다. 즉 void TestClass(int t1, int t2)는 원래 TestClass(this, 3, 4) 형태로 불리워야 한다는 것이다.


Advanced Usage
----------------------------------------------------------------------------------
  • Thread를 제어하는 2가지: Mutex 와 condition

    • Mutex : 운영체제에서 익히나온 것이다. Thread 가 동시다발적으로 어느 특정 리소스를 사용할때, 한개의 Thread만 사용하게 하고싶을때 사용하는 녀석이다. 제대로 사용하지 않으면 성능저하를 일으키니 디자인설계때부터 조심히 사용해야 하는 녀석이다. 추천하는

      - header : #include <boost/thread/mutex.hpp>
      - 추천하는 것 : boost::mutex::scoped_lock
      - 이유 : 사용하기 편하다. 이 변수를 괄호 안에 선언하게 되면 괄호의 끝을 만날때까지 잠금이 되고, 괄호를 벗어나게되면 락이 풀린다. (이에 대한 원리는 간단히 생각해보면 되는데, 생성자에서 락을 걸고, 소멸자에서 락을 푸는 코드를 삽입한 것이다)

      boost::mutex mutexVar; // Lock을 걸 mutex 변수

      if ( test_module == true )
      {
           boost::mutex::scoped_lock( mutexVar ); // Mutex Lock이 걸림
           // Do something
      } // 이 시점에서 락이 풀린다.


    • condition : 쓰레드를 잠들게 하고 동작하게 하는 제어 변수. 보통 어떤 값을 기다릴때 while 로 돌리는 방법이나 sleep 을 줘서 일정시간마다 체크하는 경우가 있는데 이는 대부분 비효율적이며, 데이터가 아직 완성이 안되어있으면 잠들어있다가 완료시점에 신호를 보내어 깨어나게 한다. 기억해야 할 점은, 만약 집단의 쓰레드들을 관리해서 경쟁적으로 한개씩 깨어나게 하고 싶다면 하나의 condition 변수를 쓰레드들 사이에서 공유해야 한다.

      void threadFunction(void)
      {
           while( true )
           {
                boost::mutex::scoped_lock lock( mutexVar );
                // Thread 초기화 작업
                condition.wait(mutexVar); // 현재 실행중인 Thread는 대기모드로
                                                    // 들어가고 mutexVar로 걸린 락이 해지
                                                    // 된다.
      // 외부 코드에서 깨우고 싶을때.. 
      condition.notify_one(); // 잠들어있는 것중에서 경쟁적으로 한개만 깨울때
      condition.notify_all(); // 잠들어있는 모든 녀석을 깨울때


Error Message
----------------------------------------------------------------------------------
  1.  /usr/local/include/boost-1_36/boost/thread/pthread/condition_variable.hpp:71: boost::condition_variable_any::~condition_variable_any(): Assertion `!pthread_mutex_destroy(&internal_mutex)' failed.

    원인 : 생성한 Thread 들은 condition.wait() 을 하고 있는데 프로세스가 죽은 경우 이런 메시지가 나온다.

    해결 : 프로세스 종료 루틴에서 모든 쓰레드를 join 시킨후(또는 모두 종료시킨후) 종료하게 한다.

'Tools for Dev' 카테고리의 다른 글

Introduction to LaTeX  (2) 2009.01.21
자기 계정에 git repository를 호스팅해보자.  (0) 2009.01.07
Excel 에서 유용한 팁  (0) 2008.12.18
Simple GIT Usage  (0) 2008.11.24
GIT - Fast Version Control System  (9) 2008.11.13

댓글