detach 함수는 thread 오브젝트에 연결된 스레드를 떼어냅니다.

그래서 detach 이후에는 thread 오브젝트로 스레드를 제어할 수 없습니다. 그러나 detach를 호출했다고 해서 관련된 스레드가 종료 되는 것이 아닙니다. thread 오브젝트와 스레드의 연결이 끊어지는 것입니다.

 

 

< 예제. 5 >

#include <thread>

#include <iostream>

 

int main()

{

           int nThreadRunCount = 0;

           std::thread Thread = std::thread( [&] ()

                                {

                                           for( int i = 0; i < 10; ++i )

                                          {

                                          ++nThreadRunCount;

                                         

                                          std::cout << "Thread1 ID : " << Thread.get_id() << std::endl;

                                          }

                              } );

 

           while( nThreadRunCount < 3 )

           {

           }

 

           Thread.detach();

 

           //Thread.join();

 

           getchar();

           return 0;

}

 

< 실행 결과 >


 

<예제. 5>의 결과를 보면 detach 이후 스레드 id가 초기화 됨을 알 수 있습니다. 그리고 위 예제에서 join() 메소드를 주석 처리하고 있는데 만약 주석을 풀면 아래와 같은 에러가 발생합니다.



 

이렇게 thread 오브젝트가 스레드를 가지지 않는데 join 함수를 호출하면 에러가 발생하는 것을 막기 위해서는 joinable 함수를 사용합니다. joinable 함수를 호출하여 반환 값이 true인 경우에만  join 함수를 호출하면 위와 같은 에러를 막을 수 있습니다.

 

< 예제. 6 >

#include <thread>

#include <iostream>

#include <mutex>

 

int main()

{

           std::mutex mtx_lock;

 

           int nThreadRunCount = 0;

           std::thread Thread = std::thread( [&] ()

                                {

                                for( int i = 0; i < 10; ++i )

                                {

                          ++nThreadRunCount;

                                                               

                                  mtx_lock.lock();

                                  std::cout << "Thread1 ID : " << Thread.get_id() << std::endl;

                                  mtx_lock.unlock();

                                }

                          } );

 

           while( nThreadRunCount < 3 )

           {

                     mtx_lock.lock();

                     std::cout << "Thread Is Joinable : " << Thread.joinable() << std::endl;

                     mtx_lock.unlock();

           }

 

           Thread.detach();

 

           std::cout << "Thread Is Joinable : " << Thread.joinable() << std::endl;

 

           getchar();

           return 0;

}

 

< 실행 결과 3>

 

 

by 흥배 2013. 5. 3. 08:00
  • redmist 2013.05.03 10:08 신고 ADDR EDIT/DEL REPLY

    RSS에서 death라고 적혀있길래 깜짝 놀라 들어왔는데 오타였군요...

  • hatena 2013.10.23 01:10 신고 ADDR EDIT/DEL REPLY

    질문이 있습니다.
    예제소스와 실행결과를 보면, 스레드 오브젝트를 detach해서 실제 스레드와 뚝 떨궈놔도 스레드 오브젝트에 걸어놓은 람다함수의 for문은 계속 돌아가는거같은데..

    detach해서 스레드 오브젝트와 실제 스레드를 분리시켜버리면 for문이 더이상 돌지않고 정지해야하는게 아닌가요?

    • 흥배 2013.10.23 13:05 신고 EDIT/DEL

      스레드 오븐젝트 걸어 놓은 람다함수는 계속 (커널)스레드에서 사용하고 있습니다. detach를 하는 것은 더 이상 스레드 오브젝트로 스레드를 관리하지 않겠다라는 의미라고 보면 됩니다.

    • hatena 2013.10.24 00:32 신고 EDIT/DEL

      아하, 이해했습니다. 감사합니다.

| 1 |