프로그래밍/C,C++

[Modern C++] std::thread

GONII 2025. 3. 11. 12:48

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;
}

📌 주요 기능

  1. 스레드 생성
    • std::thread 객체를 생성하면 즉시 새로운 스레드에서 지정한 함수가 실행됩니다.
  2. 스레드 종료 대기 (join())
    • join()을 호출하면 메인 스레드는 해당 스레드가 종료될 때까지 기다립니다.
  3. 스레드 분리 (detach())
    • detach()를 호출하면 스레드가 독립적으로 실행되고, 프로그램의 메인 스레드와 관계없이 동작하게 됩니다.
    • 하지만 detach()된 스레드는 관리되지 않으므로 주의가 필요합니다.
  4. 스레드 ID 확인 (get_id())
    • std::this_thread::get_id() 또는 t.get_id()를 사용하여 현재 실행 중인 스레드의 ID를 확인할 수 있습니다.
  5. 하드웨어 지원 스레드 수 (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