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 |