스레드 생성과 관리

김 무무 ㅣ 2024. 9. 28. 01:26

1. 스레드 생성 방법

C++에서 스레드를 생성하는 방법

 

1) std::thread 클래스 사용:

#include <iostream>
#include <thread>

void ThreadFunction() {
    std::cout << "스레드 생성" << std::endl;
}

int main() {
    std::thread t(ThreadFunction);
    t.join();  // 메인 스레드가 t의 실행이 끝날 때까지 대기
}



2) 람다 함수 사용:

#include <iostream>
#include <thread>

int main() {
    std::thread t([](){
      std::cout << "스레드 생성" << std::endl;
    });
    t.join();
}

 

 

3) 함수 객체(Functor) 사용:

#include <iostream>
#include <thread>

class ThreadFunctor {
public:
    void operator()() {
      std::cout << "스레드 생성" << std::endl;
    }
};

int main() {
    ThreadFunctor tf;
    std::thread t(tf);
    t.join();
}

 

 

2. 스레드 생명주기

1) 생성(Created): std::thread 객체가 생성되면 새로운 스레드가 시작됨

2) 실행 가능(Runnable): 스레드가 실행될 준비가 되었지만, 아직 실행되지 않은 상태

3) 실행 중(Running): 스레드가 실제로 실행되고 있는 상태

4) 차단(Blocked): I/O 작업이나 동기화 작업 등으로 인해 스레드가 일시적으로 실행을 멈춘 상태

5) 종료(Terminated): 스레드의 실행이 완료된 상태

 

 

3. 스레드 우선순위와 스케줄링

스레드 스케줄링은 주로 운영 체제에 의해 처리되며, 다음과 같은 일반적인 정책이 있다.

선점형 스케줄링(Preemptive Scheduling):

운영 체제가 각 스레드에 일정 시간을 할당하고, 시간이 끝나면 다른 스레드로 전환한다.

 

협력적 스케줄링(Cooperative Scheduling):

스레드가 자발적으로 제어권을 양보할 때까지 실행한다.

 

C++에서 스레드 관리를 위해 사용할 수 있는 주요 함수들:

t.join() : 스레드 t의 실행이 끝날 때까지 대기

t.detach() : 스레드 t를 메인 스레드로부터 분리

std::this_thread::sleep_for() : 현재 스레드를 지정된 시간 동안 일시 정지

std::this_thread::yield() : 현재 스레드가 다른 스레드에게 실행 기회를 양보

ex)

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

void ThreadFunction(int id) {
    for (int i = 0; i < 3; i++) {
      std::this_thread::sleep_for(std::chrono::seconds(1));
      std::cout << "스레드 " << id << " 실행" << std::endl;
    }
}

int main() {
    // 두 개의 스레드를 생성하고, 각 스레드가 3초 동안 작업을 수행한 후 종료
    std::thread t1(threadFunction, 1);
    std::thread t2(threadFunction, 2);
    t1.join();
    t2.join();
}

'멀티스레딩' 카테고리의 다른 글

동기화 기법: Atomic 연산  (0) 2024.10.05
메모리 구조와 멀티스레딩  (0) 2024.10.03
데이터 동기화 기초  (0) 2024.10.01
멀티스레딩 기초  (0) 2024.09.28
개요  (0) 2024.09.26