[c++] 뮤텍스를 사용한 교착 상태 (Deadlock) 방지하기

뮤텍스(mutex)는 공유 자원에 대한 접근을 조율하기 위한 동기화 기법 중 하나입니다. 뮤텍스를 올바르게 사용하면 교착 상태(deadlock)를 방지하고 안전한 다중 스레드 환경을 구축할 수 있습니다. 이번에는 C++에서 뮤텍스를 활용하여 교착 상태를 방지하는 방법에 대해 알아보겠습니다.

교착 상태란?

교착 상태는 다중 프로세스 또는 스레드에서 두 개 이상의 프로세스나 스레드가 서로 상대방의 작업이 끝나기를 기다리며 무한히 대기하는 상황을 말합니다. 이는 프로그램이 더 이상 진행되지 못하는 상태로 이어질 수 있습니다.

뮤텍스를 사용한 교착 상태 방지하기

C++에서는 std::mutex 클래스를 사용하여 뮤텍스를 구현할 수 있습니다. 이를 활용하여 다음과 같이 교착 상태를 방지할 수 있습니다.

#include <mutex>
#include <thread>

std::mutex g_mutex;

void threadFunction1()
{
    g_mutex.lock();
    // Critical Section
    g_mutex.unlock();
}

void threadFunction2()
{
    g_mutex.lock();
    // Critical Section
    g_mutex.unlock();
}

int main()
{
    std::thread t1(threadFunction1);
    std::thread t2(threadFunction2);

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

    return 0;
}

위의 예제 코드에서 std::mutex를 사용하여 두 개의 스레드가 동시에 공유 자원에 접근하는 것을 막고 있습니다. 뮤텍스는 lock()unlock() 메서드를 통해 임계 영역(critical section)을 보호합니다. 이를 통해 교착 상태를 방지할 수 있습니다.

결론

뮤텍스를 사용하여 교착 상태를 방지할 수 있지만, 잘못 사용하면 교착 상태를 유발할 수도 있습니다. 따라서 뮤텍스를 사용할 때에는 주의 깊게 동기화를 진행해야 합니다. 이외에도 교착 상태를 방지하기 위한 다양한 기법들이 있으니, 상황에 맞게 적절한 방법을 선택하는 것이 중요합니다.

참고 문헌: cppreference.com - std::mutex