[c++] C++에서의 뮤텍스 데드락 해결 방법
뮤텍스(mutex)는 C++에서 스레드 간의 동기화를 위해 사용되는 도구로, 여러 스레드가 동시에 접근하는 것을 제어할 수 있습니다. 그러나 여러 뮤텍스가 교착 상태(deadlock)에 빠질 수 있으므로 주의해야 합니다. 뮤텍스 데드락을 해결하기 위한 몇 가지 방법이 있습니다.
1. 뮤텍스 사용 순서 지정
서로 다른 락(mutex)을 얻을 때 일정한 순서를 따르는 것이 뮤텍스 데드락을 방지하는데 도움이 됩니다. 예를 들어, 모든 스레드가 항상 동일한 순서로 뮤텍스를 잠그도록 하는 방식으로 데드락을 피할 수 있습니다.
std::mutex firstMutex;
std::mutex secondMutex;
// 스레드 1
firstMutex.lock();
secondMutex.lock();
// 작업 수행
secondMutex.unlock();
firstMutex.unlock();
// 스레드 2
firstMutex.lock();
secondMutex.lock();
// 작업 수행
secondMutex.unlock();
firstMutex.unlock();
2. 스코프 범위에서 락 해제
뮤텍스를 사용하는 코드 블록의 스코프 범위에서 뮤텍스를 해제하는 것이 중요합니다. 이렇게 하면 뮤텍스 잠금을 잊어버리는 실수를 방지할 수 있습니다.
std::mutex mtx;
{
std::lock_guard<std::mutex> lock(mtx);
// 뮤텍스가 코드 블록을 벗어나면 자동으로 해제됨
// 작업 수행
}
3. std::lock 사용
C++11부터는 std::lock을 사용하여 여러 뮤텍스를 한꺼번에 잠글 수 있습니다. 이를 통해 뮤텍스 데드락을 방지할 수 있습니다.
std::mutex mtx1, mtx2;
std::lock(mtx1, mtx2); // 두 뮤텍스를 안전하게 잠금
// 작업 수행
mtx1.unlock();
mtx2.unlock();
결론
뮤텍스 데드락은 복잡한 동시성 코드에서 발생할 수 있는 심각한 문제입니다. 뮤텍스 사용 순서 지정, 스코프 범위에서 락 해제, 그리고 std::lock 사용은 뮤텍스 데드락을 해결하는데 도움이 될 수 있습니다.
참고 문헌: https://en.cppreference.com/w/cpp/thread/mutex