스레드?
프로세스(프로그램) 내에서 실행되는 독립적인 코드의 흐름
이 흐름이 추상적일수 있는데 예를 들어 하단의 코드를 보자.
int main()
{
cout << "Hello" << endl;
Test();
return 0;
}
string Test()
{
cout << "Test" << endl;
}
이 코드를 실행시킨 프로그램은 main → Test → main 의 흐름으로 프로그램이 실행된다. 이런게 하나의 (코드)흐름이다.
그래서 프로그램이 실행되면 코드가 실행되기는 해야하니까 무조건 하나의 흐름은 가지고 있을 수 밖에 없는데 이게 main thread라 한다.
이 main thread는 디버깅창에서도 확인할 수 있다.
● 스레드는 각 스택 영역을 가지며 힙, 데이터 영역을 공유 한다.
● 하나의 스레드는 CPU의 하나의 코어가 움직인다.
스레드 생성
thread를 include해주어야 사용할 수 있다.
#include <thread>
//스레드 개체 t 생성
std::thread t;
스레드 실행
스레드 실행은 함수를 연결해 주면 그때 부터 실행된다.
// 일반 함수
void Func() { cout<<"Hi"<<endl; };
// 스레드 t1 생성
std::thread t1;
// 스레드 t1 함수 연결하여 실행
t1 = std::thread(Func);
// 스레드 t2 생성과 동시에 함수 연결하여 실행 1
std::thread t2 = std::thread(Func)
// 스레드 t2 생성과 동시에 함수 연결하여 실행 2
std::thread t2(Func);
스레드 클래스의 멤버 함수
int main()
{
std::thread t1;
// 1.cpu의 코어 개수를 반환
int core = t1.hardware_concurrency();
// 2.스레드의 고유 ID를 반환
// 자료형이 auto인 이유는 운영체제마다 id관리하는 자료형이 달라 윈도우에선 int로 받을 수 없다.
auto id = t1.get_id(); // == std::thread::id id = t1.get_id()
// 3.t1의 스레드가 끝날때 까지 기다림
t1.join()
// 4.부모 스레드와 자식 스레드의 연결을 끊어 버림, 여기선 main과 t1의 연결을 끊는다.
t1.detach()
}
여기서 join 이라는 함수가 중요한데, main thread가 우리가 만든 다른 스레드보다 먼저 종료하면 에러가 생성된다.
그래서 join 을 통해 우리가 만든 스레드가 종료될 때까지 기다리게하는 것이다.
개념 정리
스레드 : 프로세스 내에서 실행되는 독립적인 코드의 흐름