[c++] C++ 스탠다드 라이브러리에서의 뮤텍스

C++ 프로그램에서 데이터 경쟁 상태를 방지하고 동시성 문제를 처리하기 위해 뮤텍스를 사용할 수 있습니다. C++언어에서는 C++11 표준 이후에 <mutex> 헤더를 이용하여 뮤텍스를 제공합니다.

std::mutex 클래스

std::mutex 클래스는 가장 기본적인 뮤텍스를 제공하는데, 이를 사용하여 크리티컬 섹션을 보호할 수 있습니다. 아래는 std::mutex 클래스의 예시입니다.

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

std::mutex mtx;

void function() {
    mtx.lock();
    // 크리티컬 섹션에서의 작업
    mtx.unlock();
}

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

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

    return 0;
}

std::mutex 클래스의 lock()unlock() 함수를 사용하여 크리티컬 섹션에서의 작업을 보호하고, 데이터 경쟁 상태를 방지할 수 있습니다.

std::lock_guard 클래스

std::lock_guard 클래스는 std::mutex의 락 및 언락을 자동으로 처리하는 RAII(Resource Acquisition Is Initialization) 스타일의 가장 간단한 락 클래스입니다. 아래는 std::lock_guard 클래스의 예시입니다.

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

std::mutex mtx;

void function() {
    std::lock_guard<std::mutex> lock(mtx);
    // 크리티컬 섹션에서의 작업
}

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

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

    return 0;
}

std::lock_guard 클래스는 std::mutex 객체를 생성자에 전달하여, 해당 객체를 락 걸고, 해당 스코프를 벗어나면 자동으로 언락을 처리합니다.

요약

뮤텍스는 C++ 프로그램에서 동시성 문제데이터 경쟁 상태를 처리하는 데 사용됩니다. C++ 스탠다드 라이브러리에서는 std::mutex 클래스와 std::lock_guard 클래스를 사용하여 뮤텍스를 구현할 수 있습니다.

이와 같은 방법들을 이용하여 안정적이고 효율적인 동시성 제어를 구현할 수 있습니다.

참고 자료