본문 바로가기

C++

[C++] 멀티스레드 프로그래밍

멀티스레드 프로그래밍(Multithreaded Programming)

  • 여러 개의 프로세서 유닛을 사용하여 여러 연산을 병렬로 처리하는 것
  • CPU/GPU 의 코어 개수가 늘어나면서 멀티스레드 프로그래밍이 용이해짐
  • C++ 11 부터 표준 멀티스레드 라이브러리를 지원 

 

C++에서 스레드 생성

#include <thread>
#include <iostream>
using std::thread;
using namespace std;

void func1() {
	for (int i = 0; i < 10; i++) {
    	cout << "스레드 1" << endl;
    }
}

void func2() {
	for (int i = 0; i < 10; i++) {
    	cout << "스레드 2" << endl;
    }
}

int main() {
    thread t1(func1); //스레드 객체 생성
    thread t2(func2);
    
    t1.join(); //스레드 실행 종료 후 리턴
    t2.join();
}

 

 

멀티스레드 프로그래밍에서 발생하는 문제점

  • 교착상태(Deadlock)
    • 여러 스레드가 동시에 다른 스레드의 작업이 끝날 때까지 기다리는 상태 (공유 리소스 접근 권한을 얻기 위해 무한정 기다림)
    • 교착 상태가 발생하지 않도록 예방하는 것이 바람직함 (ex. 여러 리소스에 대한 권한을 한 번에 확보함)
  • 경쟁상태
    • 여러 스레드가 공유 리소스를 동시에 접근할 때 발생 가능
    • 데이터 경쟁 : 여러 스레드가 동시에 공유 메모리에 접근 가능한 상황에서, 한 개 이상의 스레드가 공유 메모리에 데이터를 쓸 때 발생
  • 테어링(Tearing)
    • 읽기 테어링 : 어떤 스레드가 공유 메모리에 데이터의 일부만 쓰고 나머지를 아직 쓰지 못한 상태에서 다른 스레드가 데이터를 읽을 때 발생. (두 스레드가 읽는 데이터 값이 다름)
    • 쓰기 테어링 : 두 스레드가 동일 데이터를 동시에 쓸 때, 두 스레드가 각각 데이터의 다른 부분을 쓸 때 발생. (데이터를 쓴 부분이 달라 작업 수행 결과가 달라짐)
  • 잘못된 공유(false-sharing)
    • CPU 내 코어 간의 메모리 정보가 공유되어 하드웨어적인 병목현상으로 인해 성능 저하가 발생하는 것

 

 

 

 

 

LIST

'C++' 카테고리의 다른 글

자동 정렬되는 STL (Map vs Set)  (0) 2021.08.30
[C++] 문자열(string)을 특정 문자로 자르기  (0) 2021.04.24
[C++] STL 정리 - map  (0) 2021.01.15
[C++] STL 정리 - vector  (0) 2021.01.14