입출력은 시스템 콜 이라고 해서 운영체제 커널에 요청을 해서 운영체제가 처리해주는것이다. ( 무거운 명령 )

 

쓰레드를 생성해주세요~ 라는것도 유저레벨에서 멋대로 할 수 있는게 아니라

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

+ Recent posts