입출력은 시스템 콜 이라고 해서 운영체제 커널에 요청을 해서 운영체제가 처리해주는것이다. ( 무거운 명령 )
쓰레드를 생성해주세요~ 라는것도 유저레벨에서 멋대로 할 수 있는게 아니라
OS 에게 부탁을 해야한다.
당연하게도 OS 마다 생성하는 api 가 다르기 때문에
리눅스 , window 마다 다를 수 있다.
그래서 어느 한 환경에서 종속적인 코드를 짜면 나중에 곤란해질 수 있다.
#include <window.h>
::CreateThread();
그러나 c++ 11 부터는 <thread> 가 나와서 공영적인 라이브러리? 가 나와서 이걸 사용하면 된다.
생성은 간단하다.
std::thread t ;
t 가 생성 되었지만 t는 아무런 작업도 하지 않는 쓰레드이다.
std::thread t(Hello) 라고 해주면
생성되서 Hello() 함수를 실행하는 t 가 되는것이다.
혹은
std::thread t;
t= std::thread(Hello);
std::thread를 생성하고 뒤늦게 함수랑 연결시켜줘도 된다. ( 쓰레드 객체만 미리 생성 가능 )
그리고 t 는 t=std::thraed(Hello); 이 부분에서 비로서 실행되는거기 때문에 이 시점에 thread ID 라는것을 부여 받는다.
std::tread t 일때는
auto id = t.get_id() 해주면 id 는 0 이 나오는것을 알 수 있다.
쓰레드 관련함수는 아래 5가지만 알면 충분하다.
t.hardware_concurrency() // cpu 코어 개수가 몇 개인지 힌트를 준다. 100프로 확률로 정확하지는 않다.
t.get_id() // 각 쓰레드마다 부여되는 쓰레드 ID를 get ( 쓰레드 사이에는 안겹친다. 그래서 구분 가능 )
t.detach() // std::thread 객체에서 실제 쓰레드를 분리. ( 일단 있다는 것만 알아도 된다. 자주 사용할 일 없다.)
t.joinable() // detach 상태이거나 연동된 쓰레드가 없구나를 판별하기 위해 사용
- 실제로 joinable 은 F12 타고 가보면 thread id가 0인지 아닌지만 체크한다.
- 실질적으로 t라는 thread 객체가 관리하고 있는 쓰레드가 살아있는지 없는지만 확인한다.
그래서 t.joinable을 바로 쓰지 않고 실질적으로는
if(t.joinable()){ t.join();} // 연결이 되어있으면 기다려라
이렇게 많이 쓴다.
t.join()
그래서 실질적으로는 if(t.joinable()){ t.join();} 이런식으로 많이 쓴다.
'C++과 언리얼로 만드는 게임 개발 > Part4. Server' 카테고리의 다른 글
★(중요_다시듣기)★DeadLock | V (0) | 2022.04.28 |
---|---|
lock 동기화 방법(2) | V (0) | 2022.04.27 |
Atomic 동기화 방법(1) | V (0) | 2022.04.27 |
환경 설정 (0) | 2022.04.12 |
서버 OT (0) | 2022.04.12 |