以示例方式記錄unique_lock&lock_guard

#include <iostream>
#include <mutex>
#include <thread>
#include <vector>

/*  參考鏈接:https://www.cnblogs.com/fnlingnzb-learner/p/9542183.html
*   @desc: unique_lock
*   @constructor:
*       (1) unique_lock() noexcept;                 // 構造一個空的unique_lock對象,此時並不擁有任何mutex
*       (2) explicit unique_lock (mutex_type& m);   // 擁有mutex,並構造時候調用mutex.lock()對其上鎖
*       (3) unique_lock (mutex_type& m, try_to_lock_t tag);//tag=try_lock表示調用mutex.try_lock()嘗試加鎖
*       (4) unique_lock (mutex_type& m, defer_lock_t tag) noexcept;//tag=defer_lock表示不對mutex加鎖,只管理mutex,此時mutex應該是沒有加鎖的
*       (5) unique_lock (mutex_type& m, adopt_lock_t tag); //tag=adopt_lock表示mutex在此之前已經被上鎖,此時unique_locl管理mutex
*       (6) template <class Rep, class Period>
*           unique_lock (mutex_type& m, const chrono::duration<Rep,Period>& rel_time);//在一段時間rel_time內嘗試對mutex加鎖,mutex.try_lock_for(rel_time)
*       (7) template <class Clock, class Duration>
*           unique_lock (mutex_type& m, const chrono::time_point<Clock,Duration>& abs_time);//mutex.try_lock_until(abs_time)直到abs_time嘗試加鎖
*       (8) unique_lock (const unique_lock&) = delete;//禁止拷貝構造
*       (9) unique_lock (unique_lock&& x);//獲得x管理的mutex,此後x不再和mutex相關,x此後相當於一個默認構造的unique_lock,移動構造函數,具備移動語義,movable but not copyable
*   @function
*       unique_lock用於對mutex互斥量進行管理,管理方式很靈活
*   @method
*       lock()      -- 對管理的mutex進行加鎖
*       try_lock()  -- 對管理的mutex嘗試加鎖
*       unlock()    -- 對管理的mutex解鎖
*   @diffrent 與lock_guard的區別
*       unique_lock與lock_guard的功能類似
*       優點:unique_lock 對管理的mutex的控制更加自由靈活
*       缺點:unique_lock 由於需要管理mutext的狀態,更加浪費空間和更慢
*/

std::mutex g_mtx;
int g_count = 0;

void ThreadWork() {
    // std::unique_lock<std::mutex> lock_helper(g_mtx);
    std::lock_guard<std::mutex> lock_helper(g_mtx);
    for (int i = 0; i < 1000; i++)
        g_count++;
}

int main() {
    std::vector<std::thread> threadVec;
    for (int i = 0; i < 10; i++) {
        threadVec.emplace_back(ThreadWork);
    }

    for (auto& th : threadVec)
        th.join();
    std::cout << g_count << std::endl;
}


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