【学习笔记】C++并发与多线程笔记五:unique_lock详解

本文详细介绍了C++中unique_lock的使用,包括为何在某些场景下优于lock_guard,以及如何通过不同构造参数实现灵活的锁管理。unique_lock提供了lock(), unlock(), try_lock()和release()等方法,允许在代码中精确控制锁的获取与释放,以优化并发性能。此外,还探讨了所有权转移和解绑mutex的功能,强调了其灵活性和效率之间的平衡。

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

一、前言

本文接上文 【学习笔记】C++并发与多线程笔记四:互斥量(概念、用法、死锁) 的内容,主要纪录 unique_lock 的使用方法以及原理。

二、uniqie_lock取代lock_quard

uniqie_lock 是个类模板,它的功能跟 lock_quard 类似,但比 lock_quard 更灵活。在工作中,一般用 lock_quard (推荐使用)就足够了,但在一些特殊的场景下会用到 uniqie_lock。

在上篇文章中讲到了 lock_quard 取代了 mutex 的 lock() 和 unlock(),在 lock_quard 的构造函数中上锁,在析构函数中解锁,这点其实在 uniqie_lock 中也是一样的。

uniqie_lock 在使用上比 lock_quard 灵活,但代价就是效率会低一点,并且内存占用量也会相对高一些。

uniqie_lock 的缺省用法实际上与 lock_quard 一样,可以直接替换,代码如下:

#include <iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std;

class A {
   
 public:
  /* 把收到的消息(玩家命令)存到队列中 */
  void inMsgRecvQueue() {
   
    for (int i = 0; i < 100000; ++i) {
   
      cout << "inMsgRecvQueue exec, push an elem " << i << endl;
      std::unique_lock<std::mutex> m_guard1(m_mutex1);
      msgRecvQueue.push_back(i); /* 假设数字 i 就是收到的玩家命令 */
    }
  }
  /* 消息队列不为空时,返回并弹出第一个元素 */
  bool outMsgLULProc(int& command) {
   
    std::unique_lock<std::mutex> m_guard1(m_mutex1);
    if (!msgRecvQueue.empty()) {
   
      command = msgRecvQueue.front(); /* 返回第一个元素 */
      msgRecvQueue.pop_front();       /* 移除第一个元素 */
      return true;
    }
    return false;
  }
  /* 把数据从消息队列中取出 */
  void outMsgRecvQueue() {
   
    int command = 0;
    for (int i = 0; i < 100000; ++i) {
   
      bool result = outMsgLULProc(command);
      if (result)
        cout << "outMsgLULProc exec, and pop_front: " << command << endl;
      else
        cout << "outMsgRecvQueue exec, but queue is empty!" << i << endl;
      cout 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值