본문 바로가기

Programming Language/C&C++

C++11에서 추가된 클래스 - thread

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 최신 버전의 C++11 라이브러리에서는 운영체제의 함수를 사용하지 않고도 자체적으로 멀티스레드를 구현할 수 있습니다. std::thread 클래스가 바로 그 기능을 수행합니다. 함수를 서로 다른 스레드에서 실행시키는 방법은 다음과 같습니다.

1. 스레드 객체를 생성한다.

std::thread의 생성자는
매개변수가 없는 함수의 경우: thread(함수)
매개변수가 있는 함수의 경우: thread(함수, 매개변수 순서대로 나열...)
이렇게 스레드 객체를 생성하는 것만으로도 이미 함수가 실행됩니다. 별도의 start/stop 함수를 호출하지 않습니다. 왜인지는 모르겠으나 C#처럼 해당 스레드를 일시중지시켰다 재개하는 기능은 원래 없습니다. C++의 thread클래스는 해당 함수가 스스로 종료할 때 까지 스레드를 유지합니다.

2. thread::join()함수를 실행한다.

C#의 스레드 클래스는 Main 메서드가 종료되어도 thread객체는 함수가 종료될때까지 그대로 유지되는데, C++에서는 스레드가 다 종료될 때까지 main함수에게 대기하라고 지시해야 합니다. join함수가 그런 역할을 합니다.

thread 클래스는 다음과 같은 틀을 가집니다.

/* thread.cpp */
#include <iostream>
#include <thread>

void function1();
void function2(const char * str);
void function3(const char * str, int count);

int main(int argc, char * argv[])
{
	/* function1 함수를 별도의 스레드에서 실행 시작 */
	std::thread thread1(function1);
	/*  function2, 3 함수를 매개변수를 대입해 별도의 스레드에서 실행 시작 */
	std::thread thread2(function2, "Hello, World!");
	std::thread thread3(function3, "count 5000", 10);
	char _tmp = '\0';

	std::cout << "main... start" << std::endl;
	std::cout << "main... end" << std::endl;

	/* 모든 스레드가 종료되기도 전에 main 함수가 종료되지 않도록 보류시킵니다. */
	/* 이것을 넣기 않으면 Debug Assertion Error를 냅니다. */
	thread1.join();
	thread2.join();
	thread3.join();

	std::cout << "Press Enter to Exit...";
	std::cin.ignore();

	return 0;
}

void function1()
{
	for (int i = 0; i < 50; i++)
	{
		std::cout << "function1 : " << i << std::endl;
	}
}

void function2(const char * str)
{
	for (int i = 0; i < 50; i++)
	{
		std::cout << "function2 : " << str << " " << i << std::endl;
	}
}

void function3(const char * str, int count)
{
	for (int i = 0; i < count; i++)
	{
		std::cout << "function2 : " << str << " " << i << std::endl;
	}
}

위 코드를 실행하면 function1, function2, function3이 서로 다른 스레드에서 동시에 실행되어 출력 결과에 세 함수의 출력이 혼재되는 것을 확인할 수 있습니다.