[c++] C++11에서 도입된 뮤텍스 적용 방법

C++11부터는 스레드 간 동기화를 위해 std::mutex가 도입되었습니다. 뮤텍스는 여러 스레드가 공유 데이터에 접근하는 것을 제어하기 위해 사용됩니다. 이번 글에서는 C++11에서 도입된 뮤텍스를 사용하여 스레드 간 동기화를 구현하는 방법에 대해 살펴보겠습니다.

1. std::mutex의 기본 사용법

뮤텍스는 std::mutex 클래스로 선언하고, lock()unlock() 메서드를 사용하여 임계 영역을 보호합니다.

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

std::mutex mtx;

void sharedPrint(const std::string& msg, int id) {
    mtx.lock();
    std::cout << "Message " << id << ": " << msg << std::endl;
    mtx.unlock();
}

int main() {
    std::thread t1(sharedPrint, "Hello", 1);
    std::thread t2(sharedPrint, "World", 2);

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

    return 0;
}

2. std::lock_guard를 활용한 뮤텍스 사용

std::lock_guard는 뮤텍스의 라이프타임을 스코프의 끝까지 제한하여 깨끗한 자원 관리를 할 수 있게 해줍니다.

void sharedPrint(const std::string& msg, int id) {
    std::lock_guard<std::mutex> guard(mtx);
    std::cout << "Message " << id << ": " << msg << std::endl;
}

3. std::unique_lock를 활용한 뮤텍스 사용

std::unique_lockstd::lock_guard와 유사하지만, 락을 해제하거나 다시 잠글 수 있는 유연성을 제공합니다.

void sharedPrint(const std::string& msg, int id) {
    std::unique_lock<std::mutex> lock(mtx);
    std::cout << "Message " << id << ": " << msg << std::endl;
    // lock.unlock(); // 락 해제
    // lock.lock();   // 다시 락 걸기
}

C++11에서 도입된 std::mutex를 사용하면 멀티스레딩 환경에서의 동기화 문제를 효과적으로 해결할 수 있습니다. 기본적인 std::mutex 사용법부터 std::lock_guardstd::unique_lock을 활용한 응용 방법까지 숙지하여 안정적인 멀티스레드 프로그래밍을 할 수 있습니다.

이상으로 C++11에서 도입된 뮤텍스 적용 방법에 대해 알아보았습니다. 감사합니다!

[참고 자료]