[C++]C++11, thread 샘플 정리

intro

  • C++11 에 thread 라이브러리가 지원되니 너무 편해졌다.
  • 기존엔 이런식으로 귀찮게 일일이 작업을 했었었는데, 표준으로 들어가버리니 일일이 신경안써도 되서 좋긴한데…
    #if defined(_WIN32) || defined(_WIN64)
          HANDLE threadID = (HANDLE)_beginthreadex(NULL, 0, InternalThreadProc, this, 0, NULL);
          if(NULL == threadID)
          {
              //error
          }
    #else
          pthread_t threadID;
          int ret = pthread_create(&threadID, NULL, InternalThreadProc, this);
     
          if(0 != ret)
          {
              //error
          }
    #endif
    

sample

  • std::thread 생성자는 대략 이런식으로 생겼고.
    class thread
      {    // class for observing and managing threads
    public:
      class id;
     
      typedef void *native_handle_type;
     
      thread() _NOEXCEPT
          {    // construct with no thread
          _Thr_set_null(_Thr);
          }
     
      template<class _Fn,
          class... _Args>
          explicit thread(_Fn&& _Fx, _Args&&... _Ax)
          {    // construct with _Fx(_Ax...)
          _Launch(&_Thr,
               _STD bind(_Decay_copy(_STD forward<_Fn>(_Fx)),
                  _Decay_copy(_STD forward<_Args>(_Ax))...));
          }
    
  • 각종 생성 샘플은 이정도로
    #include  <thread>
    class TEST_CLASS
    {
    public:
      void member1_of_class(int args)
      {
          std::thread thread03(&TEST_CLASS::member2_of_class, this, args, args+3);
          thread03.join();
      };
     
      void member2_of_class(int args1, int args2)
      {
          std::cout << "TEST_CLASS::member2_of_class: " << args1 << ", " << args2  << std::endl;
      };
    };
    void thread02(int arg1)
    {
      std::thread::id thread_id = std::this_thread::get_id();
      for (int i = arg1; i < 5; i++)
      {
          std::cout << "thread02 [" << thread_id << "]: " << i << std::endl;
        
      }
    }
    void test_thread()
    {
      std::thread::id thread_id_main = std::this_thread::get_id();
      std::cout << "thread main :" << thread_id_main << std::endl;
     
      //case1. lambda 방식으로
      std::thread thread1([](){ 
          std::thread::id thread_id_01 = std::this_thread::get_id();
          for (int i = 0; i < 3; i++)
          {
              std::cout << "thread01 [" << thread_id_01 << "]: " << i << std::endl;
          }
      });
      //------------------------------------------------------
      // detach나 join으로 thread 리소스를 정리할수있다.
      // detach 했으면 굳이 join 부르지 않아도 되는데, 더이상 thread를 관리하지 못함.
      //------------------------------------------------------
      //Separates the thread of execution from the thread object - http://en.cppreference.com/w/cpp/thread/thread/detach
      thread1.detach();
     
      //join 할수 있는지 확인하자..
      if (true == thread1.joinable())
      {
          //thread 가 종료할때까지 대기.
          thread1.join();
      }
     
      //case2.
      int inputArgs = 2;
      std::thread thread2(thread02, inputArgs);
      std::thread::id thread_id_02 = thread2.get_id();
      if (thread2.joinable())
      {
          std::cout << "thread02 ["<< thread_id_02 << "] join" << std::endl;
          thread2.join();//thread 가 종료할때까지 대기.
      }
    
      //case3. 
      TEST_CLASS test_class;
      test_class.member1_of_class(3);
    }