[Modern C++] 15.1. 쓰레드(thread)

윤정민·2023년 8월 1일
0

C++

목록 보기
36/46

1. 프로세스와 쓰레드

  • 프로세스: 운영체제에서 실행되는 프로그램의 최소 단위
    • 이는 cpu의 코어에서 실행 됨
      • cpu는 하나의 코어가 다양한 기능을 하기 위해 context switching기술을 사용함
      • 다음으로 무슨 프로그램으로 스위치 할지는 운영체제의 스케줄러가 알아서 결정
  • 쓰레드
    • cpu 코어에서 돌아가는 프로그램 단위
      • cpu의 코어 하나에서는 한 번에 한 개의 쓰레드의 명령을 실행
    • 한 개의 프로세스는 최소 한 개의 쓰레드로 이루어져 있으며, 여러 개의 쓰레드로 구성될 수 있게 됨
    • 여러개의 쓰레드로 구성된 프로그램을 멀티 쓰레드 프로그램이라 부름
  • 쓰레드와 프로세스의 차이점
    • 프로세스들은 서로 메모리를 공유하지 않음
    • 한 프로세스 안에 있는 쓰레드는 서로 같은 메모리를 공유하게 됨

2. 멀티쓰레드를 사용하는 이유

  • 병렬 가능한 작업을 빠르게 수행 가능
    • 재귀함수를 사용하는 경우 병렬 작업 불가(이전 작업의 결과를 사용하기 때문에 작업을 순차적적으로 진행해야 함)
  • 대기 시간이 긴 작업들
    • 핑이 긴 작업들을 멀티 쓰레드를 사용해 요청한다면 기다리는 시간없이 수행 가능

3. C++에서 쓰레드 생성하기

  • 이전에는 c++ 표준에 쓰레드가 없어, 각 플랫폼 마다 다른 구현을 해야했지만 C++11에서부터 표준에 쓰레드가 추가되면서, 쓰레드 사용이 매우 편해짐
  • 쓰레드 생성
    thread t1(func1);
  • 쓰레드의 작업이 끝날 때까지 main함수가 끝나지 않게하는 함수
    t1.join();
  • 메인 스레드에서 분리해 백그라운드에서 실행하는 함수
    • 메인 스레드가 종료되면 백그라운드도 종료됨을 주의하자
      t1.detach()
  • 예시 코드
#include <iostream>
#include <thread> //헤더 추가
using std::thread;

void func1() {
  for (int i = 0; i < 10; i++) {
    std::cout << "쓰레드 1 작동중! \n";
  }
}

void func2() {
  for (int i = 0; i < 10; i++) {
    std::cout << "쓰레드 2 작동중! \n";
  }
}

void func3() {
  for (int i = 0; i < 10; i++) {
    std::cout << "쓰레드 3 작동중! \n";
  }
}
int main() {
  thread t1(func1); //thread 객체를 생성
  thread t2(func2);
  thread t3(func3);

  t1.join(); // thread들이 실행을 종료하면 리턴하는 함수
  t2.join();
  t3.join();
}

4. Thread에 인자 전달하기

  • 인자로 데이터의 시작점과 끝점, 결과를 담을 변수 레퍼런스를 받음
thread(worker, data.begin() + i * 2500, data.begin() + (i + 1) * 2500, &partial_sums[i])
  • counter라는 변수를 모든 쓰레드가 접근 가능하게 인자로 전달할 수 있음
    thread(worker, std::ref(counter))
profile
그냥 하자

0개의 댓글