[C++11] std::thread 사용법 (함수, 클래스)
std::thread란
클래스 스레드는 단일 실행 스레드를 나타냅니다. 스레드를 사용하면 여러 기능을 동시에 실행할 수 있습니다.
std::thread는 C++11에서 표준으로 되었습니다.
std::thread Header 파일
#include <thread>
thread 생성 방법
thread 생성은 보통 아래 방법이 있습니다.
lambda를 이용한 방법도 있는데, 나중에 한번 알아보도록 하겠습니다.
1. 함수를 이용한 생성 => std::thread 변수(함수명, 전달인자)
2. Class 멤버 함수를 이용한 생성 => std::thread 변수(class명::thread 수행할 함수, class 생성자, 전달 인자);
3. Class Static 함수를 이용한 생성 => std::thread 변수(class명::thread 수행할 함수, 전달 인자);
thread 생성 예제
thread가 작업 중인데, main 함수에서 return 0; 으로 종료하려고 할 때, 비정상적으로 종료될 수 있습니다.
이를 방지하고자, thread의 join 함수를 사용하여, main thread는 자식 thread의 작업을 기다리고, thread의 작업이 끝나면, main thread는 실행을 재개합니다.
thread를 실행시킬 때, 함수의 전달인자를 넣을 수도 있고, 넣지 않아도 됩니다.
1. 함수를 이용한 생성
1부터 1000까지 더하는 작업을 하는 thread를 만들어 보겠습니다.
#include <iostream>
#include <string>
#include <thread>
void sum_thread()
{
int sum = 0;
for (int i = 1; i <= 1000; i++)
sum += i;
std::cout << "sum_thread() : " << sum << std::endl;
}
int main()
{
std::thread sum(sum_thread);
std::cout << "main() : start" << std::endl;
sum.join();
std::cout << "main() : finish" << std::endl;
}
위 코드를 실행해보면 아래와 같이 출력합니다.
thread의 작업이 끝날때까지 기다리기위해 join 함수를 사용하였습니다.
join 함수가 끝나고 main thread에서 실행을 재개합니다.
2. Class 멤버 함수를 이용한 생성 & 3. Class Static 함수를 이용한 생성
#include <iostream>
#include <string>
#include <thread>
class SUM {
public :
static void sum_static(int num) {
int sum = 0;
for (int i = num; i <= 100; i++)
sum += i;
std::cout << "sum_static() : " << sum << std::endl;
}
void sum_func(int num) {
int sum = 0;
for (int i = num; i <= 1000; i++)
sum += i;
std::cout << "sum_func() : " << sum << std::endl;
}
};
int main()
{
// 2. Class의 멤버 함수를 사용한 Thread 생성
std::thread thread1(&SUM::sum_func, SUM(), 10);
// 3. Class의 Static 함수를 사용한 Thread 생성
std::thread thread2(SUM::sum_static, 10);
std::cout << "main() : start" << std::endl;
thread1.join();
thread2.join();
std::cout << "main() : finish" << std::endl;
}
thread가 병렬로 작업을 수행해서 출력이 섞여서 출력이 됩니다.
나중에는 이러한 것들을 순차적으로 수행할 수 있도록 해보도록 하겠습니다.
'프로그래밍 > c++' 카테고리의 다른 글
[C++11] shared_ptr 정리 및 간단한 사용 예제 (0) | 2023.04.23 |
---|---|
[C++11] std::bind, std::placeholders 간단한 사용법 (0) | 2023.04.04 |