멀티스레드는 프로그램에서 독립적으로 실행되는 최소한의 처리 단위인 스레드를 여러 개 사용하여 동시에 작업을 수행하는 것을 말한다. 멀티스레드를 사용하면 시스템의 자원을 보다 효율적으로 사용할 수 있으며, 작업의 처리 속도를 높일 수 있다.
아래 코드는 멀티스레드를 사용하여 두 개의 함수를 동시에 실행하는 방법을 보여준다.
// ...
#include <thread>
// 첫 번째 함수: HelloThread
// 출력: "Hello Thread"
void HelloThread()
{
cout << "Hello Thread" << '\n';
}
// 두 번째 함수: HelloThread_2
// 입력: int32 num (정수형 변수)
// 출력: 입력받은 num 값
void HelloThread_2(int32 num)
{
cout << num << '\n';
}
int main()
{
//HelloThread();
vector<std::thread> v;
// for문을 사용하여 총 10개의 스레드를 생성합니다.
for (int32 i = 0; i < 10; i++)
{
// 각 스레드는 HelloThread_2 함수를 실행하며, i 값을 인자로 전달합니다.
v.push_back(std::thread(HelloThread_2, i));
}
// 생성된 10개의 스레드를 join()을 통해 메인 스레드와 동기화합니다.
// 이를 통해 각각의 스레드가 작업을 완료한 후 메인 스레드가 진행되도록 합니다.
for (int32 i = 0; i < 10; i++)
{
if (v[i].joinable())
v[i].join();
}
// 모든 스레드가 종료된 후 메인 스레드에서 "Hello Main"을 출력합니다.
cout << "Hello Main" << '\n';
}
시스템 자원을 보다 효율적으로 사용할 수 있다.
작업 처리 속도를 높일 수 있다.
독립적인 작업을 수행할 수 있으므로 코드의 구조가 깔끔해질 수 있다.
경쟁 상황 (race condition)이 발생할 수 있다.
동기화를 위한 추가 작업이 필요하다 (예: mutex(lock), semaphore 등).
스레드 생성 및 종료에 대한 오버헤드가 존재한다.
디버깅이 어려울 수 있다.
멀티스레드는 시스템 자원을 효율적으로 사용하고 작업 처리 속도를 높이는 데 도움이 되지만, 동시에 race condition과 같은 문제를 해결하기 위한 동기화 작업이 필요하다. 이 예제에서는 10개의 스레드를 생성하여 동시에 작업을 수행하고, join() 함수를 사용하여 메인 스레드와 동기화하는 방법을 보여주었다. 멀티스레드 프로그래밍을 할 때는 스레드 간의 데이터 공유 및 동기화 문제에 주의하여야 한다.