쓰레드 개론, 쓰레드 생성

원래벌레·2022년 3월 29일
0

💎 쓰레드 개론


💍 쓰레드 :

  • 쓰레드란 무엇인가 ? : 쓰레드는 식당으로 치자면 종업원의 수이다. 식당에서 여러명의 종업원을 두게되면 일처리가 빠르다.

  • 식당과 실제 컴퓨터의 차이 : 식당에 종업원은 각자가 각자의 영혼이 있다. 하지만 컴퓨터는 CPU 안에 있는 코어를 통해서 쓰레드를 작동 시키기 때문에, 예를들어 코어가 1개이고, 쓰레드가 4개이면 CPU의 코어가 쓰레드 4개를 하나 하나씩 돌면서 움직이게 된다.

  • 이러한 쓰레드는 힙과 데이터영역을 함께 공유 할 수 있다.( 동시 참조 가능 )
    하지만 이것은 문제를 일으킬 수 있음

  • 서버를 돌릴 때에 이상적인 쓰레드 : 쓰레드 만큼의 코어가 존재하여 각각 일대일 대응이 되게끔 하는 것

  • 멀티 쓰레드를 설계 하면서 중요하게 생각할 두가지 :
    1) 코어와 쓰레드가 병렬적으로 이어지게끔 한다.
    2) 힙과 데이터영역을 참조할 때 충돌이 발생하지 않게끔 한다.

💎 쓰레드 생성


💍 #include<thread> :

  • 윈도우와 리눅스 체제에서 각각 시스템콜을 요청하는 식의 쓰레드 생성 방법이 있다. 하지만 현재는 thread 라이브러리가 일반화 되면서 둘을 구분 할 것없이 하나의 코딩으로 두 환경에서 코드가 사용 할 수 있게끔 됐다.

💍 std::thread t(HelloThread) :

  • 쓰레드 객체를 생성합니다. 여기서 쓰레드 객체는 생성과 동시에 HelloThread라는 함수를 실행하고 종료합니다.

💍 int32 count = t.hardware_concurrency() :

  • CPU의 코어 개수를 리턴해줍니다. / 거의 안쓰임

💍 auto id=t.get_id() :

  • 쓰레드의 이름을 가져옵니다.

💍 t.join() :

  • main 함수가 쓰레드가 끝날 때 까지 기다려줍니다.

💍 t.detatch() :

  • std::tread 객체에서 실제 쓰레드를 분리합니다. / 거의 안쓰임 t 객체에 대한 상태나 정보를 추출 할 수가 없음

💍 t.joinable() :

  • joinable 함수는 쓰레드 t 의 id가 0인지 아닌지를 판별합니다. 0일때는 현재 쓰레드 객체가 죽어있는 상태입니다.

  • 따라서 이 joinable 함수를 통해서 섣불리 join을 하는것이 아니라, 먼저 join을 해야 할지를 joinable을 통해서 확인을 하고, join을 실시한다.

if(t.joinable()){
	t.join();           //일반적인 사용
}

💍 쓰레드는 먼저 선언 후, 쓰레드에서 할 일을 그다음에 정 할 수 있다.

  • std::thread t;
    t=std::thread(HelloThread);
  • 이렇게 함으로써 좋은 점 : 예를들어서 vector 구조에다가 thread 객체를 넣고 함수를 실행 해준다 할 때, 처음에 vector.resize(10) 으로 vector의 크기를 정하고 그안에 쓰레드가 하나하나씩 구동되게 만든다 할 때에 먼저 빈 객체를 만들고 쓰레드가 할 일을 설정해주는 것이 효과적이다.

💍 쓰레드가 실행하는 함수의 인수가 있는 경우

  • std::thread t(HelloThread,2);
  • 실행 할 함수와 함수의 인자를 쉼표로 넣어주면 된다. 이 인자는 쉼표를 통해서 여러개도 입력 가능하다. cf ) thread 명령어

💍 벡터를 이용해 여러 쓰레드를 호출 하는법

  • 결과를 보면 결과가 엉망진창이다. 이것은 thread가 각각이 실행되어 행동하기 때문이다.
profile
학습한 내용을 담은 블로그 입니다.

0개의 댓글