以示例方式记录unique_lock&lock_guard

本文详细解析了C++中unique_lock的构造函数和方法,对比lock_guard,阐述了其对mutex的灵活管理方式,包括锁的加锁、尝试加锁和解锁等操作。通过代码示例,展示了如何使用unique_lock来控制多线程环境中的资源访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值