본문 바로가기
DEV

[C++] Thread 란? + 예제

by 아노앤유노 2023. 6. 30.
반응형

c++
thread

 

Thread 란?

C++의 스레드(Thread)는 동시에 실행될 수 있는 독립적인 실행 흐름을 나타내는 개념입니다. 각각의 스레드는 별도의 스택을 가지며, 코드의 일부분을 동시에 실행할 수 있습니다. 멀티스레딩을 사용하면 병렬성을 활용하여 프로그램의 성능을 향상시킬 수 있습니다.

C++11부터는 <thread> 헤더를 통해 스레드 관련 기능을 제공하고 있습니다.

 

  1. std::thread 클래스: 스레드를 생성하고 관리하는 클래스입니다. std::thread 객체를 생성할 때 실행할 함수나 람다 표현식을 전달하여 스레드를 시작할 수 있습니다.
#include <iostream>
#include <thread>

void threadFunction() {
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    std::thread t(threadFunction);  // 스레드 생성
    t.join();                       // 스레드가 종료될 때까지 대기

    return 0;
}
  1. std::this_thread 네임스페이스: 현재 실행 중인 스레드에 대한 정보와 조작을 제공하는 함수들을 포함하고 있습니다.
    1. std::this_thread::get_id(): 현재 스레드의 고유한 식별자(Thread ID)를 반환합니다.
    2. std::this_thread::sleep_for(): 현재 스레드를 일정 시간 동안 대기시킵니다.
    3. std::this_thread::yield(): 현재 스레드를 양보하고 다른 스레드에게 실행 기회를 주도록 합니다.
  2. std::mutex 클래스: 상호 배제(mutual exclusion)를 위한 기능을 제공하는 클래스입니다. 멀티스레드 환경에서 공유 데이터에 대한 접근을 보호하기 위해 사용됩니다. 주로 다음과 같은 함수와 함께 사용됩니다.
    1. std::mutex::lock(): 뮤텍스를 획득합니다. 다른 스레드가 이미 뮤텍스를 획득한 경우, 해당 스레드가 뮤텍스를 반납할 때까지 대기합니다.
    2. std::mutex::unlock(): 뮤텍스를 반납합니다.
    3.  
  3. std::atomic 템플릿 클래스: 원자적(atomic) 연산을 지원하는 클래스입니다. 멀티스레드 환경에서 동시 접근으로 인한 데이터 경쟁(Race condition)을 방지하기 위해 사용됩니다. 원자적 연산은 동시에 수행되더라도 일관된 결과를 보장합니다.
반응형
#include <iostream>
#include <thread>
#include <atomic>

std::atomic<int> counter(0);

void incrementCounter() {
    for (int i = 0; i < 100000; ++i) {
        counter.fetch_add(1, std::memory_order_relaxed);
    }
}

int main() {
    std::thread t1(incrementCounter);
    std::thread t2(incrementCounter);

    t1.join();
    t2.join();

    std::cout << "Counter value: " << counter << std::endl;

    return 0;
}

위의 예시에서 std::atomic<int>를 사용하여 counter 변수를 원자적으로 증가시키고 있습니다. 멀티스레드에서 counter에 대한 동시 접근이 발생할 수 있지만, std::atomic을 사용하면 안전하게 원자적인 증가 연산을 수행할 수 있습니다.

스레드를 사용할 때 주의할 점:

스레드 간의 동기화를 위해 뮤텍스, 조건 변수 등의 동기화 기법을 사용해야 합니다.
공유 데이터에 대한 동시 접근으로 인한 경쟁 조건을 피하기 위해 원자적 연산을 사용하거나 적절한 동기화 기법을 사용해야 합니다.
스레드의 생성과 종료, 동기화 등의 작업은 예외 처리를 포함해 안전하게 처리해야 합니다.
멀티스레딩은 병렬 처리를 통해 성능 향상을 이끌어내는 강력한 도구이지만, 스레드 간의 동기화와 경쟁 조건 등에 대한 이해와 조심이 필요합니다. 신중하게 사용해야 하며, 애플리케이션의 안정성과 일관성을 유지하기 위해 적절한 스레드 관리 및 동기화를 수행해야 합니다.

2023.07.06 - [DEV] - [C++] 포인터 pointer 란?

 

[C++] 포인터 pointer 란?

포인터 pointer 란? C++에서 포인터(pointer)는 메모리 주소를 저장하는 변수입니다. 포인터는 다른 변수 또는 데이터 구조에 대한 참조를 저장하고 사용하는 데 사용됩니다. 포인터를 사용하여 메모

iknowandyouknow.tistory.com

2023.06.30 - [DEV] - [C++] IOCP 설명 / 예제

 

[C++] IOCP 설명 / 예제

IOCP 란? IOCP(입출력 완료 포트, Input/Output Completion Port)는 Windows 운영 체제에서 비동기 입출력 작업을 처리하기 위한 메커니즘입니다. IOCP는 I/O 작업에 대한 효율성과 확장성을 제공하여 다중 클라

iknowandyouknow.tistory.com

2023.06.30 - [DEV] - [C++] STL 이란? + 예시

 

[C++] STL 이란? + 예시

STL 이란? C++의 STL(Standard Template Library)은 C++ 표준 라이브러리의 중요한 구성 요소로, 일반적인 데이터 구조와 알고리즘을 제공하여 프로그래머들이 간편하게 사용할 수 있도록 돕습니다. STL은 컨

iknowandyouknow.tistory.com

 

반응형

'DEV' 카테고리의 다른 글

[JAVA] spring json 사용하기  (0) 2023.06.30
[JAVA] spring model 사용하기  (0) 2023.06.30
[C++] IOCP 설명 / 예제  (0) 2023.06.30
[C++] STL 이란? + 예시  (0) 2023.06.30
[ORACLE] LOCK 확인 및 해제  (0) 2023.06.19