본문 바로가기

Programming/CPP11&14

[C++11] thread 지원 (1)

반응형

C++11에 언어 차원의 thread를 지원하게 되었습니다.

OS에 상관없이 사용이 가능하며 전달할 수 있는 인자의 형식도 자유롭게 사용이 가능합니다.

thread는 <thread> 헤더에 정의가 되어있습니다.

먼저 간단한 thread의 예제입니다.

#include <thread>
#include <iostream>

void ThreadFunc(int nVal)
{
	std::cout << nVal << std::endl;
}

void main()
{
	std::thread th1(ThreadFunc, 100);

	th1.join();
}

std::thread 타입의 객체를 생성하는 것으로 thread는 생성됩니다.

thread 함수의 형태에 맞게 뒤에 추가적으로 인자를 전달하면 됩니다.

그리고 join() 메소드는 thread가 종료될 때까지 대기합니다.

thread가 복잡한 연산을 하게 되면 main()이 먼저 종료될 수가 있습니다.

이것을 막기 위해서 사용됩니다.

기존의 Win32 프로그래밍에서는 WaitForSingleObject()로 동일한 동작이 가능했습니다.

그리고 생성할 때 당연히 함수 객체를 사용해서도 가능합니다.

#include <thread>
#include <string>
#include <iostream>

class MyPrint
{
public:
	MyPrint(const std::string& text)
	{
		myWord = text;
	}
	void operator()(const std::string& szText) const
	{
		std::cout << myWord << std::endl;
		std::cout << szText << std::endl;
	}
	void PrintFunc() const
	{
		std::cout << myWord << std::endl;
	}
private:
	std::string myWord;
};

void main()
{
	auto th1 = std::thread(MyPrint("Hello, World!"), "Bye, World!");
	th1.join();

	MyPrint c("C++11 thread");
	auto th2 = std::thread(&MyPrint::PrintFunc, c);
	th2.join();
}

클래스를 활용해서 위와 같이 구현도 가능합니다.

함수 객체를 통하면 클래스의 생성자를 통한 초기화도 가능합니다.

th2의 호출 방식처럼 thiscall을 명시적으로 호출하는 것과 같은 형태로도 가능합니다.

물론 th2의 호출 방식에서도 추가적으로 인자를 전달하는 것도 가능합니다.

thread를 지원하게 되면서 좀 더 편하게 멀티스레드 프로그래밍이 가능해졌습니다.

thread에서 return으로 결과는 받는 방법은 다음에서 확인할 수 있습니다.

2015/06/28 - [Programming/CPP11&14] - [C++11] thread 지원 - future를 통한 return값 획득 (2)

반응형