std::thread는 C++11에서 도입된 멀티스레딩을 지원하는 표준 라이브러리의 클래스입니다. 이를 통해 프로그램 내에서 여러 개의 스레드를 생성하고 실행할 수 있으며, 병렬 처리를 활용할 수 있습니다.
📌 std::thread 개요
std::thread는 C++의 <thread> 헤더에 포함되어 있으며, 이를 사용하여 새로운 실행 흐름을 생성할 수 있습니다.
#include <iostream>
#include <thread>
void func() {
std::cout << "Hello from thread!\n";
}
int main() {
std::thread t(func); // 새로운 스레드 생성 및 실행
t.join(); // 메인 스레드가 t 스레드 종료까지 대기
return 0;
}
📌 주요 기능
- 스레드 생성
- std::thread 객체를 생성하면 즉시 새로운 스레드에서 지정한 함수가 실행됩니다.
- 스레드 종료 대기 (join())
- join()을 호출하면 메인 스레드는 해당 스레드가 종료될 때까지 기다립니다.
- 스레드 분리 (detach())
- detach()를 호출하면 스레드가 독립적으로 실행되고, 프로그램의 메인 스레드와 관계없이 동작하게 됩니다.
- 하지만 detach()된 스레드는 관리되지 않으므로 주의가 필요합니다.
- 스레드 ID 확인 (get_id())
- std::this_thread::get_id() 또는 t.get_id()를 사용하여 현재 실행 중인 스레드의 ID를 확인할 수 있습니다.
- 하드웨어 지원 스레드 수 (std::thread::hardware_concurrency())
- 실행 가능한 동시 스레드 개수를 반환하며, CPU의 논리적 코어 개수와 관련이 있습니다.
📌 주요 메서드 정리
함수 | 설명 |
join() | 해당 스레드의 종료를 기다림 |
detach() | 스레드를 백그라운드에서 실행 (제어권 해제) |
get_id() | 현재 스레드의 ID 반환 |
joinable() | 스레드가 join() 가능 여부 반환 (true/false) |
std::this_thread::get_id() | 현재 실행 중인 스레드의 ID 확인 |
std::thread::hardware_concurrency() | 동시 실행 가능한 스레드 수 반환 |
📌 예제: 인자 전달
스레드 실행 함수에 인자를 전달할 수도 있습니다.
#include <iostream>
#include <thread>
void printMessage(std::string msg, int count) {
for (int i = 0; i < count; ++i) {
std::cout << msg << " " << i << std::endl;
}
}
int main() {
std::thread t(printMessage, "Hello", 5);
t.join(); // 스레드 종료 대기
return 0;
}
참고: 값 전달 시 복사본이 생성되며, 참조 전달을 원할 경우 std::ref()를 사용할 수 있습니다.
std::thread t(printMessage, std::ref(msg), 5);
📌 주의할 점
- std::thread 객체가 소멸되기 전에 반드시 join() 또는 detach()를 호출해야 합니다. 그렇지 않으면 프로그램이 종료될 때 오류가 발생합니다.
- detach()된 스레드는 종료 시점을 예측하기 어려워, 자원 관리에 주의해야 합니다.
- 스레드 간 자원 공유 시 동기화 (std::mutex, std::condition_variable 등)를 고려해야 합니다.
📌 정리
std::thread는 C++에서 멀티스레딩을 구현하는 기본적인 도구이며, 효율적인 병렬 처리를 가능하게 합니다. 하지만 적절한 동기화 없이 사용할 경우 경쟁 상태 (race condition) 문제가 발생할 수 있으므로, 이를 방지하는 기법도 함께 고려해야 합니다.
반응형
'프로그래밍 > C,C++' 카테고리의 다른 글
[Modern C++] smart pointer(unique_ptr, shared_ptr, weak_ptr) (0) | 2025.03.10 |
---|---|
[Modern C++] 우측값 레퍼런스 (0) | 2025.02.24 |
[Mordern C++] golang-style defer 만들기 (1) | 2024.11.29 |
함수(function) (0) | 2015.03.24 |
상속의 기능 (0) | 2015.02.14 |