직관적인느낌

C++ 쓰레드 기초 본문

공학

C++ 쓰레드 기초

범슐랭 2024. 9. 20. 08:00
728x90

쓰레드(Thread) 개념 요약

  1. 쓰레드란?
    • 쓰레드는 운영 체제에서 실행되는 가장 작은 단위로, 하나의 프로세스 안에서 독립적으로 실행됩니다.
    • 멀티스레딩(Multithreading)은 하나의 프로세스 내에서 여러 스레드를 동시에 실행하여 CPU 자원을 효율적으로 사용하는 방식입니다.
  2. 주요 개념
    • 멀티스레딩: 여러 작업을 동시에 처리하여 성능을 높임.
    • 컨텍스트 스위칭: 스레드 간 작업을 전환하는 과정.
    • 동기화: 여러 스레드가 공유 자원을 안전하게 사용할 수 있도록 관리(Mutex, Semaphore 등 사용).
    • 경합 상태(Race Condition): 스레드들이 공유 자원을 제대로 동기화하지 않아 발생하는 문제.
    • 데드락(Deadlock): 스레드들이 서로 자원을 기다리면서 영원히 멈추는 상태.
  3. C++ 멀티스레딩 코드 요약
    • std::thread: C++에서 스레드를 생성하고 실행하는 표준 라이브러리.
    • std::this_thread::sleep_for: 스레드를 지정된 시간 동안 멈추게 하는 함수.
    • join(): 스레드가 종료될 때까지 기다리도록 하는 함수.
  4. 추가 개념
    • std::mutex: 여러 스레드가 동일한 자원을 사용할 때 경합 상태를 방지하기 위해 사용되는 동기화 도구.
    • std::lock_guard: Mutex를 안전하게 관리하여 데드락을 방지하는 도구.

간단한 C++ 멀티스레딩 코드

#include <iostream>
#include <thread>
#include <chrono>

void print_numbers() {
    for (int i = 1; i <= 5; ++i) {
        std::cout << "Number: " << i << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

void print_letters() {
    char letters[] = {'A', 'B', 'C', 'D', 'E'};
    for (char letter : letters) {
        std::cout << "Letter: " << letter << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(1500));
    }
}

int main() {
    std::thread thread1(print_numbers);
    std::thread thread2(print_letters);

    thread1.join();
    thread2.join();

    std::cout << "All threads are finished." << std::endl;
    return 0;
}

이 코드는 두 개의 스레드를 생성하여 병렬로 실행하고, 두 스레드가 모두 종료될 때까지 기다린 후 프로그램을 종료합니다.

쓰레드를 사용할 때는 동기화 문제를 주의해야 하며, 필요에 따라 mutex와 같은 동기화 도구를 사용하여 자원 충돌을 방지해야 합니다.


추가적으로 중요한 개념

  • Thread Pool: 여러 스레드를 직접 만들고 관리하는 것 대신, 미리 스레드를 만들어 두고 필요한 작업을 할당하는 방식입니다. 이를 통해 성능 최적화가 가능합니다.
  • GIL(Global Interpreter Lock): Python에서 여러 스레드가 동시에 실행되는 것을 제한하는 메커니즘으로, 멀티스레드가 CPU 바운드 작업에서 성능을 제대로 활용하지 못하게 할 수 있습니다. 이는 특히 C 언어 등 다른 언어와의 차이점입니다.

쓰레드를 사용하는 것은 I/O 작업과 같은 경우에 유리하지만, CPU를 많이 사용하는 작업에서는 멀티프로세싱(Multiprocessing)이 더 나은 선택이 될 수 있습니다.

728x90
반응형