한국은 아직까지 윈도우 선호도가 높다. 다만 해외에서는 리눅스 선호도가 높으므로, 윈도우 기반 IOCP로 서버를 기껏 만들었는데 해외에서 리눅스로 포팅해달라고 요청 해 올 수 있음. 따라서 (가능하다면) 다양한 환경에서 돌아가는 코드를 작성하면 좋을 것.
//
#include <iostream>
#include <thread>
using namespace std;
void HelloThread()
{
std::cout << "Hello from thread!" << std::endl;
}
int main()
{
std::thread t(HelloThread);
cout << "Hello from main!" << std::endl;
//t.join(); // Wait for the thread to finish
return 0;
}
join이 없다면 다른 스레드보다 메인스레드가 먼저 끝나면 에러가 나게된다.
(std::thread::join()과 WaitForSingleObject()는 비슷한 개념.)
수행중인 스레드는 스레드창을 참고
스레드 객체 관련 함수로는 5개만 알아도 충분하다.
int count = t1.hardware_concurrency(); // CPU 코어 개수 (실패시 0리턴)
t1.get_id(); // 스레드 ID Get
t1.detach(); // std::thread 객체에서 실제 쓰레드를 분리
t1.joinable(); // 스레드가 join가능한 상태인지
t1.join(); // 현재 스레드가 t1이 끝날때까지 대기 (WaitForSingleObject와 유사)
여기서 스레드 아이디는 스레드가 수행되지 않은 상태라면 0이 나오게 된다.
joinable은 스레드가 join가능한지 체크해주는 함수 (join이 가능한지 체크. 스레드가 수행된 상태인지? detach된 상태는 아닌지? 등)
스레드를 생성하고 매개변수로 뭔가 전달하고 싶다면 두번째 인자로 전달하면 된다.
std::thread t(HelloThread, 10);
스레드 10개 만들어서 join시켜보기
vector<std::thread> vec;
for(int i = 0; i<10; ++i)
{
v.push_pack(std::thread(HelloThread_2, i));
}
for(int i = 0; i<10; ++i)
{
if(vec[i].joinable())
vec[i].join();
}