- 쓰레드를 생성한다.
- 쓰레드 종료전 반드시 join() 혹은 detach()를 해야 한다.
- join(): 스레드 종료를 대기
- detach(): 스레드를 떼어 낸다. (생성된 스레드가 독립적으로 실행)
주 스레드 종료시
- 프로세스가 종료되는데, 이때 detach() 된 스레드들도 강제로 종료된다.
참조형 인자 보낼때 주의점
- 쓰레드 함수의 인자를 "참조로 전달" 시
- lvalue reference: std::ref(n) 사용.
- rvalue reference: std::move(s) 사용.
- 하지만, 쓰레드에 참조를 보내는 것 자체가 좋은 상황이 아님.
void f(int a, int& b, std::string&& s) { b = 100; }
int main()
{
int n = 0;
std::string s = "hello";
// 쓰레드로 참조형 인자를 넘길때는 n을 그냥 넘기면 안되고, std::ref로 감싸서 보낸다.
std::thread t(&f, 10, std::ref(n), std::move(s) );
}
멤버 함수
// "hardware_concurrency": CPU가 지원하는 thread 개수 (static 함수)
// "get_id": thread ID 반환. (= std::this_thread::get_id())
// "native_handle": OS의 스레드 핸들 반환 (우선순위 같은거 바꾸고 싶을때 사용)
std::thread t( [](){} );
auto handle = t.native_handle();
SetThreadPriority(handle, THREAD_PRIORITY_TIME_CRITICAL);
// "swap": 스레드 Object swap (스레드 각각이 실행시킬 함수를 바꿀 수 있다)
std::thread t1( [](){ printf("Thread1"); } );
std::thread t2( [](){ printf("Thread2"); } );
t1.swap(t2);
// t1은 Thread2를, t2는 Thread1을 호출하게 된다.
t1.join();
t2.join();
// 이동 연산도 가능.
std::thread t4 = std::move(t1);