#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;
}
以示例方式記錄unique_lock&lock_guard
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.