본문 바로가기
C++

[C++] 스레드 개념과 예시

by 염지미 2023. 11. 28.

Thread 란?

프로세스 내에서 독립적인 실행 흐름을 갖는 작은 실행 단위이다. 일반적으로 한 프로그램은 하나의 스레드를 가지지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이것을 멀티스레드라고 한다. 멀티 스레드를 사용하게 될 경우 병렬 처리로써 여러 작업을 동시에 수행하므로 전체적인 처리 속도를 높일 수 있고, 하나의 스레드가 중단되거나 멈춰도 다른 스레드가 계속해서 실행되므로 응답성이 향상될 수 있지만, 스레드간 동기화도 해줘야하고 작업하고자 하는 양이 적으면 스레드를 생성하는데 소요되는 시간이 더 커서 오버헤드가 발생하는 등의 단점도 있다.

 

Thread 구현 방법

피보나치 수열의 계산을 예시로 들었고, 메인 함수에서 x 값을 조정해 하나의 스레드와, 두개의 스레드간 시간이 얼마나 소요되는지 비교할 수 있게끔 코드를 구현했습니다. 두 개의 result 결과 중 위의 결과가 하나의 스레드를 사용한 코드이고, 아래의 result 값이 두개의 스레드로 구현한 코드입니다.

 

피보나치 수열 25까지의 계산 결과

오버헤드 발생

 

피보나치 수열 45까지의 계산 결과

대략 3초 가까운 차이 발생

 


 

Thread 구현 코드

#include<iostream>
#include<thread>
#include<ctime>

typedef long long LL;

LL fibo1(int x) {
	if (x <= 2) {
		return 1;
	}
	return fibo1(x - 1) + fibo1(x - 2);
}

LL fibo2(int x, LL* result) {
	if (x <= 2) {
		*result = 1;
		return *result;
	}
	*result = fibo1(x - 1) + fibo1(x - 2);
	return *result;
}

int main() {
	clock_t start, end;
	LL result;
	int x = 25;
	
	// 멀티 쓰레드 사용 X
	start = clock();
	result = fibo1(x);
	end = clock();

	std::cout << "result : " << result << ", time : " << (double)(end - start) / CLOCKS_PER_SEC << "초" << std::endl;

	// 멀티 쓰레드 사용 O
	LL res1, res2;
	start = clock();
	std::thread f1(fibo2, x - 1, &res1);
	std::thread f2(fibo2, x - 2, &res2);
	f1.join();
	f2.join();
	result = res1 + res2;
	end = clock();

	std::cout << "result : " << result << ", time : " << (double)(end - start) / CLOCKS_PER_SEC << "초" << std::endl;
}

'C++' 카테고리의 다른 글

[MFC] GDI+ 사용하기  (2) 2023.12.05
[C++] 힙 개념과 구현 방법  (0) 2023.11.22
[C++] Vector 정의 및 사용법  (2) 2023.11.21

댓글