[c++] C++에서의 스레드 안전 컨테이너

C++ 프로그래밍에서 멀티스레드 환경에서 안전하게 데이터를 공유하는 것은 중요합니다. 스레드 간의 데이터 레이스 조건을 방지하기 위해 여러 가지 스레드 안전 컨테이너를 사용할 수 있습니다. 이러한 컨테이너들은 다수의 스레드로부터 안전하게 데이터에 액세스할 수 있는 메커니즘을 제공합니다.

std::mutexstd::lock_guard

C++11부터 제공되는 std::mutex 클래스는 여러 스레드 간 데이터를 보호하는 데 사용됩니다. std::lock_guardstd::mutex를 RAII 기반으로 락을 관리하기 위해 사용됩니다.

#include <mutex>
#include <vector>
#include <iostream>

std::mutex mtx;
std::vector<int> data;

void addData(int value) {
    std::lock_guard<std::mutex> lock(mtx);
    data.push_back(value);
}

int main() {
    // 스레드 안전하게 데이터 추가
    std::thread t1(addData, 5);
    std::thread t2(addData, 10);

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

    // 데이터 출력
    for (auto& d : data) {
        std::cout << d << " ";
    }
    std::cout << std::endl;

    return 0;
}

위의 코드에서 std::lock_guardstd::mutex를 이용하여 addData 함수에서 데이터에 안전하게 동시에 액세스할 수 있도록 합니다.

std::atomic

std::atomic 템플릿은 다중 스레드 환경에서 안전하게 데이터를 읽고 쓰기 위한 방법을 제공합니다.

#include <iostream>
#include <atomic>

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

void incrementCounter() {
    ++counter;
}

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

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

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

    return 0;
}

std::atomic은 변수에 대한 접근을 원자적인 동작으로 보장하여 스레드 간의 경쟁 조건을 방지합니다.

std::shared_mutex

C++17부터 제공되는 std::shared_mutex는 읽기-쓰기 잠금을 관리하기 위한 클래스입니다.

#include <shared_mutex>
#include <iostream>
#include <map>

std::map<int, int> data;
std::shared_mutex mtx;

void readData(int key) {
    std::shared_lock<std::shared_mutex> lock(mtx);
    if (data.find(key) != data.end()) {
        std::cout << "Value at key " << key << " is " << data[key] << std::endl;
    } else {
        std::cout << "Key not found" << std::endl;
    }
}

void writeData(int key, int value) {
    std::unique_lock<std::shared_mutex> lock(mtx);
    data[key] = value;
}

int main() {
    std::thread t1(writeData, 1, 100);
    std::thread t2(readData, 1);

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

    return 0;
}

std::shared_mutex는 읽기 동작에 대한 공유 락 및 쓰기 동작에 대한 고유 락을 제공하여 안전하게 데이터를 읽고 쓸 수 있도록 합니다.

이러한 스레드 안전 컨테이너들을 사용하여 C++에서 멀티스레딩 환경에서 안전하게 데이터를 관리할 수 있습니다.

참고 자료