[Boost] boost 라이브러리에서thread 다중 스레드 상세 설명 4 --recursive_mutex(귀속식 상호 배척량)

1328 단어
한 라인에서 실행 중 자물쇠를 다시 받아야 하는 경우 (예: test_thread_deadlock) 일반적인 방법으로 자물쇠가 사라집니다.귀속식 상호 배척량 boost::recursive_이 문제를 피하기 위해 mutex, 예(test_thread_recursivelock).boost::recursive_mutex는 상술한 자물쇠 문제가 발생하지 않습니다. 자물쇠의 계수를 증가시킬 뿐입니다. 그러나 unlock과lock의 횟수가 같아야 다른 라인이 이 자물쇠를 잠글 수 있습니다.
namespace {
	boost::mutex g_mutex;  
	
	void threadfun1()
	{
		PRINT_DEBUG("enter threadfun1...");
		boost::lock_guard<boost::mutex> lock(g_mutex);
		PRINT_DEBUG("execute threadfun1...");
	}  
	
	void threadfun2()
	{
		PRINT_DEBUG("enter threadfun2...");
		boost::lock_guard<boost::mutex> lock(g_mutex);
		threadfun1();
		PRINT_DEBUG("execute threadfun2...");
	}
}

namespace {
	boost::recursive_mutex g_rec_mutex;

	void threadfun3()
	{
		PRINT_DEBUG("enter threadfun3...");
		boost::recursive_mutex::scoped_lock lock(g_rec_mutex);
		//  
		// boost::lock_guard<boost::recursive_mutex> lock(g_rec_mutex);
		PRINT_DEBUG("execute threadfun3...");
	}  

	void threadfun4()
	{
		PRINT_DEBUG("enter threadfun4...");
		boost::recursive_mutex::scoped_lock lock(g_rec_mutex);
		threadfun3();
		PRINT_DEBUG("execute threadfun4...");
	}
}

//  
void test_thread_deadlock()
{
	threadfun2();
}

//  
void test_thread_recursivelock()
{
	threadfun4();
}

좋은 웹페이지 즐겨찾기