当前位置: 首页 > 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) 确保临界区最小化。

 

http://www.dtcms.com/a/60629.html

相关文章:

  • 用友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?
  • 回溯-子集
  • python之数据处理的安全(链家)
  • 深入String、StringBuffer、String 实例化有两种方式、String、StringBuffer常用方法
  • AHT20 BMP280 STM32C8T6 cubemx
  • 有必要使用 Oracle 向量数据库吗?
  • 蓝桥杯省赛真题C++B组-裁纸刀2022
  • postgresql14编译安装脚本
  • 怎么实现: 大语言模型微调案例
  • AI能否跨越奇点
  • RabbitMQ使用延迟消息
  • 升级到碳纤维齿轮是否值得?