검색결과 리스트
lock_guard에 해당되는 글 1건
- 2013.06.24 [ VC11-C++11 ] 병렬 프로그래밍. lock_guard
std::mutex를 사용하여 복수의 스레드에서 사용하는 공유 자원을 서로 침범 없이 사용할 수 있습니다. 그러나 lock 사용하여 뮤텍스에 대한 소유권을 얻은 후 실수로 unlock을 하지 않으면 아무도 그 공유 자원을 사용하지 못하는 데드락 상태에 빠질 수 있습니다.
예를 들면 아래와 같은 경우가 이런 실수를 하기 쉽습니다.
..........
mutex.lock();
if( n < 10 ) {
return false;
}
.......
mutex.unlock();
위 코드에서 n이 10보다 작은 경우 unlock을 하지 않고 바로 빠져 나오게 됩니다. 이거 이외에도 lock을 사용한 후 예외가 발생하여 throw 되는 경우 unlock을 하지 않는 실수를 할 수 있습니다.
이런 실수를 방지하기 위해서 lock_guard 라는 유틸리티 클래스가 있습니다.
mutex를 lock_guard와 같이 사용하면 lock_guard 클래스가 인스턴스화 될 때 자동으로 lock을 호출하고, 인스턴스가 파괴될 때 자동으로 unlock을 호출합니다.
template<class Mutex>
class lock_guard;
다음은 lock_guard를 사용한 예입니다.
< 예제. 2 >
#include <thread>
#include <iostream>
#include <mutex>
int main()
{
std::mutex mtx_lock;
std::thread Threads1( [&] ()
{
for( int i = 0; i < 5; ++i )
{
std::lock_guard<std::mutex> guard(mtx_lock);
std::cout << "Thread Num : " << i << std::endl;
}
} );
std::thread Threads2;
Threads2 = std::thread( [&] ()
{
for( int i = 10; i < 15; ++i )
{
std::lock_guard<std::mutex> guard(mtx_lock);
std::cout << "Thread Num : " << i << std::endl;
}
} );
std::thread Threads3 = std::thread( [&] ( int nParam )
{
for( int i = 20; i < 25; ++i )
{
std::lock_guard<std::mutex> guard(mtx_lock);
std::cout << "Thread Parameter : " << nParam << std::endl;
}
}, 4 );
Threads1.join();
Threads2.join();
Threads3.join();
return 0;
}
lock_guard는 뮤텍스의 소유와 해제에 대한 RAII(리소스 확보 및 초기화) 패턴이라고 볼 수 있습니다.
댓글