멀티 쓰레드

2023. 7. 24. 12:47개인공부/C++

쓰레드 사용 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
// 첫 쓰레드
#include <iostream>
#include <thread>
using std::thread;
 
void func1(){
    for (int i = 0; i < 10++i)
        std::cout << "쓰레드 1 작동중! \n";
}
 
void func2(){
    for (int i = 0; i < 10++i)
        std::cout << "쓰레드 2 작동중! \n";
}
 
void func3(){
    for (int i = 0; i < 10++i)
        std::cout << "쓰레드 3 작동중! \n";
}
 
int main()
{
    thread t1(func1); thread t2(func2); thread t3(func3);
 
    // join : 해당하는 쓰레드들이 실행을 종료한면 리턴하는 함수
    // 따라서 t1.join() 의 경우 t1이 종료하기 전 까지 리턴하지 않습니다.
    t1.join(); t2.join(); t3.join();
    
    // detach : 해당 쓰레드를 실행 시킨 후 알아서 백그라운드에서 돌아가게 된다.
    //t1.detach(); t2.detach(), t3.detach();
 
    return 0;
}
cs

 

쓰레드에 인자 전달하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
// 첫 쓰레드
#include <cstdio>
#include <iostream>
#include <thread>
#include <vector>
using std::vector;
using std::thread;
 
void worker(vector<int>::iterator start, vector<int>::iterator endint* result)
{
    int sum = 0;
    for (auto iter = start; iter < end++iter)
    {
        sum += *iter;
    }
    *result = sum;
 
    thread::id this_id = std::this_thread::get_id();
    printf("쓰레드 %x 에서 %d 부터 %d 까지 계산한 결과 : %d \n", this_id, *start, *(end - 1), sum);
 
}
 
int main()
{
    vector<int> data(10000);
    for (int i = 0; i < 10000++i)
    {
        data[i] = i;
    }
    // 각 쓰레드에서 계산된 부분 합들을 저장하는 벡터
    vector<int> partial_sums(4);
    
    vector<thread> workers;
    for (int i = 0; i < 4++i)
    {
        workers.push_back(thread(worker, data.begin() + i * 2500,
            data.begin() + (i + 1* 2500&partial_sums[i]));
    }
 
    for (int i = 0; i < 4++i)
    {
        workers[i].join();
    }
 
    int total = 0;
    for (int i = 0; i < 4++i)
    {
        total += partial_sums[i];
    }
    std::cout << "전체 합 :" << total << std::endl;
    return 0;
}
cs

 

피보나치 수열을 멀티 쓰레드를 이용해서 구하기

 일단 아래의 코드에서는 문제가 많은거 같다. 아직 멀티쓰레드에 대해서 모르는게 많다. 첫번째로 문제점은 같은 메모리 공간을 공유를 하는 과정에서 문제가 발생하고 있다! 다음 강의를 통해서 이러한 문제를 해결해보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <thread>
#include <vector>
using std::thread;
using std::vector;
 
#define DIVDE 10000000
// 피보나치 수열을 멀티쓰레드를 사용해서  빨리 구하기 
// 
int arr[10000]{ 0,1 };
 
int Fibonacci(int index)
{
    if (index == 0 || index == 1)
        return arr[index];
    else if (arr[index] != 0)
    {
        thread::id this_id = std::this_thread::get_id();
        printf("id : %x ---- %d 값이 구해져있습니다 \n", this_id, index);
        return arr[index];
    }
    else
    {
        arr[index] = (Fibonacci(index - 1+ Fibonacci(index - 2)) % DIVDE;
        
        thread::id this_id = std::this_thread::get_id();
        printf("id : %x  ---- %d 값 : %d 입니다 \n", this_id,index, arr[index]);
 
        return arr[index];
    }
}
 
int main() 
{
    vector<thread> workers;
 
    for (int i = 0; i < 4++i)
    {
        workers.push_back(thread(Fibonacci, 10));
 
    }
    
    for (int i = 0; i < 4++i)
    {
        workers[i].join();
    }
 
}
cs

 

'개인공부 > C++' 카테고리의 다른 글

스마트 포인터 공부 1  (0) 2023.07.27
sizeof  (0) 2023.03.30
const, static 정리  (0) 2023.03.21
복사 생성자, 소멸자 정리  (0) 2023.03.20
함수의 오버로딩, 생성자 정리  (0) 2023.03.19