본문 바로가기

C++

멀티 스레딩 실습 C++ /Wanna Be 컴잘알

728x90

Thread란 프로세스의 특정한 수행경로로 프로세스가 할당 받은 자원을 이용하는 실행의 단위이다.

특징으로는 별도의 스택과 레지스터를 갖고 있지만, 힙과 메모리느 서로 공유한다는 점을 가지고 있다.

 

그렇다면 Multi Thread는 무엇일까요? 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미합니다. 멀티스레딩을 하면 자원의 효율성이 증대하고 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다는 장점이 있습니다.

 

 

Q1. C++ 멀티 스레딩 간단한 실습

#include "pch.h"
#include <iostream>
#include <thread>
#include <vector>

using namespace std;

void func1() {
	for (int i = 0; i < 10; i++) {
		cout << "쓰레드 1 작동중! \n";
	}
}

void func2() {
	for (int i = 0; i < 10; i++) {
		cout << "쓰레드 2 작동중! \n";
	}
}

void func3() {
	for (int i = 0; i < 10; i++) {
		cout << "쓰레드 3 작동중! \n";
	}
}
int main() {
	
	int i = 1;
	
	thread t1(func1);
	thread t2(func2);
	thread t3(func3);
	
	t1.join();
	t2.join();
	t3.join();

	return 0;

}

 

-실행 결과-

 

Q2. 멀티스레딩을 이용하여 1~1000까지 덧셈하기

#include "pch.h"
#include <iostream>
#include <thread>
#include <vector>
#include <cstdio>

using namespace std;

void worker(vector<int>::iterator start, vector<int>::iterator end, int* result) {
	int sum = 0;
	for (auto itr = start; itr < end; ++itr) {
		sum += *itr;
	}
	*result = sum;

	// 쓰레드의 id 를 구한다.
	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];
	}
	cout << "전체 합 : " << total << endl;
}

 

-실행 결과-

 

728x90