쓰레드(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 |