쓰레드 생성(std::thread)
#include <iostream>
#include <thread> //헤더파일
void HelloThread()
{
cout<<"Hello Thread"<<endl;
}
void HelloParam(int32 num)
{
cout<<num<<endl;
}
int main()
{
std::thread t0(HelloThread); //쓰레드 생성 및 실행
std::thread t1; //쓰레드 생성만 한 상태.
t1=std::thread(HelloThread); //이런식으로 실행가능
std::thread t2(HelloParam,17); //이런식으로 인자 넘기기 가능
}
join()
#include <iostream>
#include <thread> //c++ 11부터 표준
void HelloThread()
{
cout << "Hello Thread" << endl;
}
int main()
{
std::thread t(HelloThread);
cout << "Hello Main" << endl;
t.join(); //메인쓰레드에서 t가 끝날때까지 기다린다. 안쓰면 오류
}
위 상황일때, 자식 쓰레드(t)가 아직 실행중인데, 부모 쓰레드(main)가 종료된다면 문제가 생길 수 있습니다.
이 상황을 막기 위해서 C++에서 join() 멤버함수를 제공합니다.
위 상황에서는 main함수는 t.join()을 만난 순간, t쓰레드의 실행이 다 끝날때까지 기다렸다가 끝난다면 이어서 실행하게 됩니다.
메인 스레드가 종료되고도 자식 스레드가 계속 실행중이라면 비정상적인 상황으로 간주하는데, 이것이 의도한 것이라면 detach()함수를 사용해야 합니다.
joinable()
#include <thread> //c++ 11부터 표준
void HelloThread()
{
cout << "Hello Thread" << endl;
}
int main()
{
std::thread t(HelloThread);
cout << "Hello Main" << endl;
if(t.joinable())
t.join();
}
joinable()은 해당 쓰레드의 id가 0인지 아닌지를 체크하는 기능을 합니다.
즉,
std::thread t;
if(t.joinable())
cout<<"통과";
위 코드라면, 쓰레드 t가 살아있지 않기때문에 "통과"가 출력되지 않습니다.
hardware_concurrency()
std::thread t(HelloThread);
int32 count=t.hardware_concurrency(); //cpu의 쓰레드 갯수
동시적으로 동작할수있는 CPU의 쓰레드 갯수를 알려줍니다.
만약 이 정보가 사용가능하지 않다면 0을 리턴해줍니다.
get_id()
std::thread t(HelloThread);
auto id=t.get_id(); //쓰레드마다 id. 1234이런건아닌데 다 다름
쓰레드에 부여된 id를 확인할 수 있습니다.
detach()
실행 스레드를 스레드 개체에서 분리하여 실행이 독립적으로 계속되도록 합니다. 할당된 리소스는 스레드가 종료되면 해제됩니다.
detach()를 호출한 이후에 *this는 더 이상 어떤 쓰레드도 소유하지 않습니다.
'BackEnd > IOCP게임서버' 카테고리의 다른 글
[C++ 서버] 여러개의 lock을 잡을때 (0) | 2023.02.26 |
---|---|
[C++ 서버] Lock 기초(mutex) (0) | 2023.02.25 |
[C++서버] Atomic (0) | 2023.02.25 |
[C++ 서버] 환경 설정 (0) | 2022.08.08 |