使用方式
lock_guard:通過構造函數和析構函數控制鎖的作用範圍,創造對象的時候加鎖,離開作用域的時候解鎖;
std::mutex m_mutex;
void print(int cnt)
{
std::lock_guard<mutex> lock(m_mutex);
cout << std::this_thread::get_id() << " " << cnt << endl;
}
unique_lock:可以通過構造函數和析構函數控制鎖的作用範圍,也可以在構造函數中延時加鎖,在需要的時候手動加鎖和解鎖。
std::mutex m_mutex;
void print(int cnt)
{
//用unique_lock來對鎖進行管理.defer_lock是它的構造參數之一.用來推遲加鎖.
unique_lock<mutex> lock(m_mutex, defer_lock);
/*
...這裏可以進行一系列線程安全的操作...
*/
//手動加鎖.
lock.lock();
cout << std::this_thread::get_id() << " " << cnt << endl;
lock.unlock();
//這裏用來計算sum的值.然後打印.因爲sum是在函數內定義的局部變量.所以下面的代碼是線程安全的.沒必要用鎖對這段代碼進行保護.所以在上面用unlock解鎖.
int sum = 0;
for (int i = 0; i < cnt; ++i)
{
sum += i;
}
//最後在手動加鎖.不用手動釋放.因爲會在生命週期結束時自動釋放.
lock.lock();
cout << std::this_thread::get_id() << " " << sum << endl;
}
賦值操作
lock_guard不支持賦值操作。unique_lock支持可移動賦值,若佔有互斥量則解鎖互斥,並取得另一者的所有權
資源消耗
unique_lock相對而言更加靈活,對於資源的消耗明顯要大一些,因爲它要維持mutex的狀態;
lock_guard雖然笨重一些,但是資源消耗相對要小一點。