Programming

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

steloflute 2014. 4. 13. 22:21

http://arer.tistory.com/45

 

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

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

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

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


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

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



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

thread(함수);

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<thread>
#include<iostream>
using namespace 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,...);

 

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

 

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





예제1

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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의 위치를 위로 옮기면 실행순서가 바뀐다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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가 반복적으로 나온다.

 

 

 

'Programming' 카테고리의 다른 글

(C#) MD5 hash  (0) 2014.04.17
Parenj, Paren#이 이제 thread를 지원합니다.  (0) 2014.04.14
(Go) channel  (0) 2014.04.13
(Go) interface{}  (0) 2014.04.10
PHP에서 SQL injection 막기  (0) 2014.03.28