김띠띵 2024. 5. 18. 05:17
스레드?

 

프로세스(프로그램) 내에서 실행되는 독립적인 코드의 흐름

이 흐름이 추상적일수 있는데 예를 들어 하단의 코드를 보자.

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 을 통해 우리가 만든 스레드가 종료될 때까지 기다리게하는 것이다.


개념 정리

 

스레드 : 프로세스 내에서 실행되는 독립적인 코드의 흐름