[c++] C++에서의 동시성 컨트롤

C++는 동시성을 다루는 데 매우 강력한 기능을 제공합니다. 다중 스레드를 사용하여 병렬 처리를 수행하거나, 비동기 작업을 처리하는 등 여러 가지 상황에서 동시성을 다룰 수 있습니다.

스레드와 뮤텍스

C++에서는 실행 스레드를 만들고 관리하기 위한 표준 라이브러리가 있습니다. std::thread 클래스를 사용하여 새로운 스레드를 만들고, std::mutex 클래스를 사용하여 뮤텍스를 통해 스레드 간의 상호배타적인 접근을 제어할 수 있습니다.

다음은 std::mutex를 사용하여 공유 데이터에 대한 안전한 접근을 보장하는 간단한 예제 코드입니다.

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;
int shared_data = 0;

void increment_shared_data() {
    mtx.lock();
    shared_data++;
    mtx.unlock();
}

int main() {
    std::thread t1(increment_shared_data);
    std::thread t2(increment_shared_data);
    t1.join();
    t2.join();
    std::cout << "Shared data value: " << shared_data << std::endl;
    return 0;
}

원자적 연산과 원자적 변수

원자적 연산은 다른 스레드에서 진행 중인 작업에 영향을 주지 않고, 해당 연산이 반드시 완전히 실행되는 것을 보장하는 연산입니다. C++에서는 std::atomic 템플릿 클래스를 통해 원자적인 변수를 선언할 수 있습니다.

다음은 std::atomic을 사용하여 원자적인 증가 연산을 수행하는 간단한 예제 코드입니다.

#include <iostream>
#include <thread>
#include <atomic>

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

int main() {
    std::thread t1([](){
        shared_data++;
    });
    std::thread t2([](){
        shared_data++;
    });
    t1.join();
    t2.join();
    std::cout << "Shared data value: " << shared_data << std::endl;
    return 0;
}

참조

C++에서 동시성을 다루는 여러 가지 방법이 있지만, 적절한 도구와 기술을 사용하여 스레드를 안전하게 제어할 수 있습니다.