#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
最新推荐文章于 2025-01-23 09:00:00 发布