본문 바로가기

Language, IDE/C, C++

[C++] Thread(쓰레드, 스레드)

반응형

쓰레드(thread)는 <thread>라이브러리에 정의되어있다. 

쓰레드(thread)란 프로세스내에서 실행되는 실행 단위이다. 주로 프로그램에는 하나의 스레드로 구성되는데 프로그램은 여러개의 

스레드를 가질 수 있다. 이러한 방식을 멀티스레드 라고 한다. 

멀티스레드를 실행하면 각 스레드들은 일정시간동안 번갈아가면서 실행된다.


예를들어 1을 1000번 출력하는 스레드 T1과 0을 1000번 출력하는 스레드 T2가 있다고할 때 

1이 1000번 출력되고 0이 1000번 수행되는 것이 아니라 1과 0이 번갈아가면서 실행된다(정확히 101010...이 출력되지는 않고 실행할때 마다 조금식 다르게 출력된다.)



C++에서 스레드는 아래와 같이 사용한다.

thread(함수);

#include<thread> #include<iostream> using namesapce std; void func1() { cout<<"my func1"<<endl; } int main() { thread t(&func1); //방법 1 t.join(); //join()을 실행시키면 t가 종료되기 전까지 기다린다. return 0; }

join()을 실행시키지 않으면 스레드가 종료되기 전에 프로그램이 끝나 런타임에러가 발생하므로 반드시 종료전에 join을 

실행시키도록 한다. 

join은 예제2를 보면 이해가 잘 될것이다.


함수에 파라미터를 넘겨주고 싶다면 아래와 같이한다.

thread(함수,파라미터1,파라미터2,...);

void func1(int value) {
	cout<<value<<endl;
}
int main() {
	thread t(&func1,3); //스레드의 파라미터로 파라미터를 넘겨준다.
//	thread t(&func1(3)); //이 방법은 잘못된 방법이다.
	t.join()
	return 0;
}

컴파일러마다 다르겠지만 VS2012에서는 최대 파라미터를 4개까지 넘길 수 있다.





예제1

다음과 같은 코드를 실행했을 때 나오는 결과이다.

#include <iostream>
#include <thread>
using namespace std;

void func1(int val) {
	for(int i=0;i<1000;i++) {
		cout<<val;
	}
}

int main() {
	thread t1(&func1,1);
	thread t2(&func1,2);
	
	for(int i=0;i<1000;i++) {
		cout<<0;
	}

	t1.join();
	t2.join();
	
	return 0;
}



위 사진과 같이 0,1,2가 번갈아가면서 실행된다. (실행할때 마다 조금식 다름)




예제2

아래와 같이 join의 위치를 위로 옮기면 실행순서가 바뀐다.

#include <iostream>
#include <thread>
using namespace std;

void func1(int val) {
	for(int i=0;i<1000;i++) {
		cout<<val;
	}
}

int main() {
	thread t1(&func1,1);
	thread t2(&func1,2);

	t1.join();
	t2.join();
	
	for(int i=0;i<1000;i++) {
		cout<<0;
	}
	
	return 0;
}


위 사진과 같이 스레드t1과 t2의 join이 메인함수의 for문이전에 실행되었기때문에 스레드 t1과 t2가 종료되기를 기다렸다가 

메인의 for문이 실행된다. 코드를 자세히보면 t1이 먼저 종료되기때문에 0이 출력되기 전에 2가 반복적으로 나온다.





반응형

'Language, IDE > C, C++' 카테고리의 다른 글

[C++/C] 포인터  (4) 2016.02.06
[C++] StringTokenizer  (0) 2013.07.15
[C++] string to int, int to string  (0) 2013.07.07
[C++ STL] 벡터(vector)  (1) 2013.07.07
[C++] 예외 처리 (Exception)  (0) 2013.07.06