c++マルチスレッド(5)-unique_lock

2112 ワード

unique_lockは自動ロック、ロック解除機能を提供し、lock_よりguardはもっと柔軟ですが、時間がかかります.
unique_lockの一般的な使い方とlock_guardは似ています.コードは次のとおりです.
bool outMsgProc(int &num)
{
	unique_lock guard(myMutex1);
	if (!myList.empty())
	{
		num = myList.front();
		myList.pop_front();
		return true;
	}
	return false;
}

でも、unique_lockの構造関数には、adopt_の2番目のパラメータがあります.lock_t、defer_lock_tまたはtry_to_lock_t,本稿ではそれぞれ紹介する.
1.adopt_lock_t
   adopt_lock_tは、相互量がロックされていることを示し、uniqueを作成するロックオブジェクトの場合、ロックは繰り返されません.
bool outMsgProc(int &num)
{
	myMutex1.lock();   //  myMutex1
	unique_lock guard(myMutex1, adopt_lock);  //      myMutex1
	if (!myList.empty())
	{
		num = myList.front();
		myList.pop_front();
		return true;
	}
	return false;
}

2.defer_lock_t
反発量にロックをかけないunique_ロック()の前にもロックは付いていません.uniqueの初期化lockオブジェクトの後、メンバー関数lock()とunlock()を呼び出してロックとロック解除を行うことができ、一定の柔軟性を体現しています.
void InMsg()
{
	for (int i = 0; i < 10000; i++)
	{
		cout << "    : " << i << endl;	
		unique_lock guard(myMutex1, defer_lock);	//   guard ,      myMutex1  
		guard.lock();     //  
		myList.push_back(i);
		
	}
}

もちろん、メンバー関数try_も呼び出されます.lock()は、コードをブロックせず、ロックに成功した場合にtrueを返し、失敗した場合falseを返します.
void InMsg()
{
	for (int i = 0; i < 10000; i++)
	{
		cout << "    : " << i << endl;	
		unique_lock guard(myMutex1, defer_lock);	//   guard ,      myMutex1  
		if (guard.try_lock())
		{
			myList.push_back(i);
		}
		else
		{
			//      ,     
		}	
	}
}

メンバー関数release()は、管理するmutexオブジェクトポインタを返し、所有権を解放します(すなわち、反発量mutexとunique_lockオブジェクトは関連付けられません.その後、反発量のロックとロック解除は自分で行います).
void InMsg()
{
	for (int i = 0; i < 10000; i++)
	{
		cout << "    : " << i << endl;	
		unique_lock guard(myMutex1);	//     ,    myMutex1  
		mutex* ptr = guard.release();      //  guard myMutex1   
		myList.push_back(i);
		ptr->unlock();                    //       unlock()
	}
}