[C++] lock_guard

c++ 에서 mutex를 lock/unlock 하는 방법은 여러 방법이 있습니다.

기본적으로 C++ 표준 라이브러리의 lock(), unlock() 함수를 호출하여 제어하는 방법이 있습니다.

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

std::mutex mtx;

void function ()
{
  mtx.lock();
  std::cout << "thread lock" << '\n';
  mtx.unlock();
}

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

하지만, 이 경우에는 lock과 unlock을 주의하여 반드시 짝지어서 호출해야 합니다.

자칫 잘못하여 lock() 호출 후에 unlock()을 호출하지 않는다면 beadlock 상태에 빠질수도 있습니다.

 

이와 같은 실수를 줄이기 위하여 c++ 표준 라이브러리 에서는 “lock_guard” 기능을 제공하고 있습니다.

lock_guard를 사용하게 되면, 명시적으로 unlock을 호출하지 않아도 해당 지역을 벗어나게 되면 내부에서 자동으로 unlock을 호출해 줍니다.

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

std::mutex g_i_mutex;

void function ()
{
  std::lock_guard<std::mutex> lock(g_i_mutex);
  std::cout << "thread lock" << '\n';
}

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

 


reference.