[C++11] mutex
#mutex
std::mutex 란
멀티 스레딩 상에서 하나의 자원에 대해서 두 프로그램이 읽기/쓰기를 할 때 발생할 수 있는 동기화 문제를 막기위해 공통으로 사용하는 자원에 lock을 걸어주는 역할을 수행해준다.
몇가지 기능으로
lock() - thread가 lock을 얻어오기 위한 기능, lock을 얻을 때 까지 대기
try_lcok() - thread가 lock 점유를 시도하고 성공(true), 실패(false)를 바로 반환
unlock() - lock을 해제함
당연한 말이지만 lock()을 동시에 호출하면 데드락 상황이 발생할 가능성이 큼
ex)
static int count = 0;
int main()
{
std::mutex m;
std::thread t1([&] {
for (int i=0; i<10; ++i)
{
m.lock();
count++;
m.unlock();
}
});
std::thread t2([&] {
for (int i=0; i<10; ++i)
{
m.lock();
count++;
m.unlock();
}
});
t1.join();
t2.join();
....
}
t1, t2에 대한 자원 점유가 보장 되면서 count의 증가는 순차적으로 일어나는 것이 보장될 수 있음
만약, 하나의 쓰레드에서 lock()을 걸고 unlock()을 하지 않는 경우 다른 쓰레드에서 무한정 lock()을 기다릴 수 있다. (주의)
이럴때 std::lock_guard의 사용이 해답이 될 수 있다.
#std::lock_gurad란, loack과 unlock을 자동으로 호출해주는 기능을 수행한다.
ex)
static int count = 0;
int main()
{
std::mutex m;
std::thread t1([&] {
for (int i=0; i<10; ++i)
{
std::lock_guard<std::mutex> lock(m);
count++;
}
});
....
}
mutext m에 대하여 lock_guard를 수행한 것이고 별도의 unlock을 생각하지 않아도 되기 때문에 편리하게 사용이 가능하다.