c++マルチスレッド(5)-unique_lock
2112 ワード
unique_lockは自動ロック、ロック解除機能を提供し、lock_よりguardはもっと柔軟ですが、時間がかかります.
unique_lockの一般的な使い方とlock_guardは似ています.コードは次のとおりです.
でも、unique_lockの構造関数には、adopt_の2番目のパラメータがあります.lock_t、defer_lock_tまたはtry_to_lock_t,本稿ではそれぞれ紹介する.
1.adopt_lock_t
adopt_lock_tは、相互量がロックされていることを示し、uniqueを作成するロックオブジェクトの場合、ロックは繰り返されません.
2.defer_lock_t
反発量にロックをかけないunique_ロック()の前にもロックは付いていません.uniqueの初期化lockオブジェクトの後、メンバー関数lock()とunlock()を呼び出してロックとロック解除を行うことができ、一定の柔軟性を体現しています.
もちろん、メンバー関数try_も呼び出されます.lock()は、コードをブロックせず、ロックに成功した場合にtrueを返し、失敗した場合falseを返します.
メンバー関数release()は、管理するmutexオブジェクトポインタを返し、所有権を解放します(すなわち、反発量mutexとunique_lockオブジェクトは関連付けられません.その後、反発量のロックとロック解除は自分で行います).
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()
}
}