검색결과 리스트
std::lock에 해당되는 글 1건
- 2013.08.26 [ VC11-C++11 ] 병렬 프로그래밍. std::lock 함수
struct X
{
std::mutex m;
int a;
std::string b;
};
void foo(X& a,X& b)
{
a.m.lock();
....
a.m.unlock();
b.m.lock();
....
b.m.unlock();
}
위의 코드에서
X x1, x2;
인스턴스를 생성 후
스레드 1에서 foo( x1, x2 )를 호출하고 동시에 스레드 2에서 f00( x2, x1 )를 호출하면 데드락 상황에 빠지게 됩니다.
위 코드는 작아서 이런 실수를 하지 않겠지만 몇 천, 몇 만 코드에서 여러 프로그래머가 같이 작업을 하다 보면 실수를 할 확률이 아주 높고, 문제가 발생하면 쉽게 찾기도 힘들기도 합니다.
이 문제를 방지하기 위해서 std::lock 이라는 함수가 있습니다. std::lock 함수를 사용하면 여러 뮤텍스를 동시에 락을 걸 수 있습니다. 아래와 같이
std::lock( a.m, b.m );
정의는 아래와 같습니다.
template<class L1, class L2, class... L3>
void lock(L1&, L2&, L3&...);
보통 좀 더 안전하게 뮤텍스를 사용하기 위해서 보통 unique_lock과 같이 사용하는 편입니다.
void foo(X& a,X& b)
{
std::unique_lock<std::mutex> lock_a(a.m,std::defer_lock);
std::unique_lock<std::mutex> lock_b(b.m,std::defer_lock);
std::lock(lock_a,lock_b);
// 공유 자원을 사용한다
}
댓글