当前位置: 首页 > news >正文

C++ 编程指南26 - 尽量缩短在临界区(critical section)内的执行时间

一:概述

        在临界区中持有互斥锁(mutex)的时间越短,线程之间的等待时间就越少,从而减少线程被挂起和恢复的开销,提高程序的并发性能。

二:示例

        在这下面个代码中,整个 do_something() 函数都持有 mutex,但实际上只有 do1() 需要锁。这会导致不必要的竞争,降低并发性能。

void do_something() // bad
{
    std::unique_lock<std::mutex> lck(my_lock);
    do0();  // 预处理,不需要锁
    do1();  // 需要加锁的事务处理
    do2();  // 后续处理,不需要锁
}

      减少临界区时间: mutex 只在 do1() 执行时持有,减少竞争,提高并发性能。并且用 std::unique_lock<std::mutex> 确保锁在代码块结束时自动释放,避免死锁。

void do_something() // OK
{
    do0();  // 预处理,不需要锁
    {
        std::unique_lock<std::mutex> lck(my_lock);
        do1();  // 需要加锁的事务处理
    } // 作用域结束,自动释放锁
    do2();  // 后续处理,不需要锁
}

三:总结 

        一般来说,无法自动检测是否持有 mutex 过长。但可以标记裸露的 lock()unlock() 调用,鼓励使用 RAII 进行资源管理。或者进行代码审查(Code Review) 确保临界区最小化。

 

相关文章:

  • 用友U9二次开发-问题记录
  • 理解知识如何在大型Vision-Language Models 中演化
  • 从基础到实践(十三):无源晶振和有源晶振的应用指南
  • 从 Web2 到 Web3:互联网发展的重要转折
  • 电脑的常见问题的原因+解决方法
  • Anaconda中虚拟环境安装g++和gcc相同版本
  • Centos 7 修改语言和输入源为中文+修改终端快捷键复制为Ctrl+C、粘贴为Ctrl+V
  • 腾讯云低代码开发应用
  • Mentalab Explore 在低密度 EEG 系统中的创新应用
  • 封装哈希表实现unordered_map和unordered_set
  • nginx优化
  • 工作记录 2016-12-28
  • 【10】单片机时间和速度的起源:指令周期与晶振频率
  • EOB Payment的一些例子
  • Http和Https的区别
  • ADSP21569 集成开发map映射功能整理
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_core_module
  • 计算机视觉cv2入门之图像空域滤波(待补充)
  • Vue Diff算法原理深度解析:如何高效更新虚拟DOM?
  • 回溯-子集
  • 河北省做网站哪家公司好/南京网络建站公司
  • 如何做优秀的视频网站设计/网站制作详细流程
  • wordpress 大站点/苏州搜索引擎排名优化商家
  • html5 微网站开发/最好的小说网站排名
  • 建筑网站大全豆丁网/公司推广策划
  • 监控摄像头做斗鱼直播网站/网页模板代码