std::unique_lock與std::lock_guard區別

使用方式

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雖然笨重一些,但是資源消耗相對要小一點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章