상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - C++에서 std::thread의 join과 detach의 차이는?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
<a href='https://sangseek.com/sangseeks/C++/ko'>C++</a>++에서 `std::thread`는 멀티스레딩을 지원하는 중요한 클래스입니다. `std::thread` 객체를 생성하면 새로운 스레드가 시작되고, 이 스레드는 특정 작업을 수행합니다. 스레드가 생성된 후, 부모 스레드는 자식 스레드가 종료될 때까지 기다리거나, 자식 스레드와 독립적으로 실행될 수 있습니다. 이때 사용되는 두 가지 주요 메서드가 `join()`과 `detach()`입니다. 이 두 메서드는 스레드의 생명주기를 관리하는 데 중요한 역할을 하며, 그 차이를 이해하는 것이 중요합니다. 1. `join()` `join()` 메서드는 호출한 스레드가 해당 스레드가 종료될 때까지 기다리도록 합니다. 즉, `join()`을 호출한 스레드는 자식 스레드가 작업을 완료하고 종료될 때까지 블록됩니다. `join()`을 호출한 후, 자식 스레드의 리소스가 해제되며, 부모 스레드는 자식 스레드의 종료 상태를 확인할 수 있습니다. 특징: - 블로킹 : `join()`을 호출하면 현재 스레드는 자식 스레드가 종료될 때까지 대기합니다. - 리소스 관리 : `join()`을 호출하면 자식 스레드의 리소스가 해제됩니다. 따라서, `join()`을 호출하지 않으면 자식 스레드가 종료되더라도 리소스가 해제되지 않아 프로그램이 비정상적으로 종료될 수 있습니다. - 예외 처리 : `join()`은 자식 스레드가 예외를 발생시킨 경우에도 이를 처리할 수 있습니다. 부모 스레드는 자식 스레드의 종료 상태를 확인할 수 있습니다. 사용 예: ```cpp include <iostream> include <thread> void threadFunction() { std::cout << "Thread is running." << std::endl; } int main() { std::thread t(threadFunction); t.join(); // main 스레드는 t 스레드가 종료될 때까지 대기 std::cout << "Thread has finished." << std::endl; return 0; } ``` 2. `detach()` `detach()` 메서드는 스레드를 분리하여 독립적으로 실행되도록 합니다. 이 메서드를 호출하면, 스레드는 부모 스레드와의 연결이 끊어지며, 부모 스레드는 자식 스레드의 종료를 기다리지 않습니다. 따라서, `detach()`를 호출한 후에는 자식 스레드가 종료되더라도 부모 스레드는 계속 실행됩니다. 특징: - 비블로킹 : `detach()`를 호출하면 부모 스레드는 자식 스레드의 종료를 기다리지 않고 즉시 다음 작업을 수행합니다. - 리소스 관리 : `detach()`를 호출한 후에는 자식 스레드의 리소스가 부모 스레드와 연결되지 않으므로, 부모 스레드는 자식 스레드의 종료 상태를 알 수 없습니다. 자식 스레드가 종료되면, 해당 스레드의 리소스는 자동으로 해제됩니다. - 위험성 : `detach()`를 사용하면 자식 스레드가 종료된 후에도 부모 스레드가 자식 스레드의 상태를 알 수 없기 때문에, 자식 스레드가 종료되기 전에 부모 스레드가 종료되면, 자식 스레드가 접근할 수 없는 메모리 공간에 접근할 수 있는 위험이 있습니다. 사용 예: ```cpp include <iostream> include <thread> include <chrono> void threadFunction() { std::this_thread::sleep_for(<a href='https://sangseek.com/sangseeks/std::chrono/ko'>std::chrono</a>::seconds(1)); std::cout << "Detached thread is running." << std::endl; } int main() { std::thread t(threadFunction); t.detach(); // t 스레드를 분리하여 독립적으로 실행 std::cout << "Main thread continues." << std::endl; std::this_thread::sleep_for(std::chrono::seconds(2)); // 메인 스레드가 잠시 대기 return 0; } ``` 결론 `std::thread`의 `join()`과 `detach()`는 스레드의 생명주기를 관리하는 두 가지 방법입니다. `join()`은 부모 스레드가 자식 스레드의 종료를 기다리며, 자식 스레드의 리소스를 관리합니다. 반면, `detach()`는 자식 스레드를 독립적으로 실행하게 하여 부모 스레드와의 연결을 끊습니다. 이 두 메서드는 각각의 사용 사례에 따라 적절히 선택하여 사용해야 하며, 스레드의 종료 상태와 리소스 관리에 대한 이해가 필요합니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기