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

C++11--锁分析

C++11--锁分析

  • 1 介绍
  • 2 锁嵌套问题
    • 示例
    • 解决方案一:使用分层锁设计,避免嵌套
    • 解决方案二:重构设计,避免方法间互相调用受锁保护的操作
    • 解决方案三:使用递归锁(不推荐,除非确实需要)

1 介绍

互斥量(mutex)类型,用于线程同步,防止数据竞争(data race)。

2 锁嵌套问题

示例

class Motor
{
public:void api_1{} {mutex.lock();// do somethingapi_2{}mutex.unlock();}void api_2{} {mutex.lock();// do somethingmutex.unlock();}private:mutex mutex;
}

解决方案一:使用分层锁设计,避免嵌套

class Motor {
public:void api_1() {std::lock_guard<std::mutex> lock(mutex);// do something that doesn't call api_2}void api_2() {std::lock_guard<std::mutex> lock(mutex);// do something}private:std::mutex mutex;
};

解决方案二:重构设计,避免方法间互相调用受锁保护的操作

class Motor {
public:void api_1() {std::lock_guard<std::mutex> lock(mutex);// do somethingapi_2_locked();  // 专门为已锁定情况设计的方法}void api_2() {std::lock_guard<std::mutex> lock(mutex);api_2_locked();}private:void api_2_locked() {// 必须在持有锁的情况下调用// do something}std::mutex mutex;
};

解决方案三:使用递归锁(不推荐,除非确实需要)

注意:递归锁通常表明设计有问题,应尽量避免。

class Motor {
public:void api_1() {std::unique_lock<std::recursive_mutex> lock(mutex);// do somethingapi_2(); // 现在可以安全调用}void api_2() {std::unique_lock<std::recursive_mutex> lock(mutex);// do something}private:std::recursive_mutex mutex;
};
http://www.lryc.cn/news/596698.html

相关文章:

  • 华为视觉算法面试30问全景精解
  • What Does “Directory of the Script Being Run” Mean?
  • final修饰符不可变的底层
  • SpringBoot PO VO BO POJO实战指南
  • Pycharm下载、安装及配置
  • 力扣 hot100 Day52
  • RabbitMQ03——面试题
  • 为什么要微调大语言模型
  • 论文笔记 | Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes
  • 解决pip指令超时问题
  • 数据结构 堆(2)---堆的实现
  • LeetCode 热题100:42.接雨水
  • Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(1)
  • 业务流逻辑如何搭建?为何橙武平台选用了 LogicFlow?​
  • day19 链表
  • 程序是如何生成的-以c语言为例
  • 信息学奥赛一本通 1553:【例 2】暗的连锁
  • 前端_CSS复习
  • 【React 入门系列】React 组件通讯与生命周期详解
  • 高可用架构模式——数据集群和数据分区
  • 单细胞转录组学+空间转录组的整合及思路
  • OneCode3.0 UI组件注解详解手册
  • 【vscode】vscode中python虚拟环境的创建
  • 回调地狱及解决方法
  • error C++17 or later compatible compiler is required to use ATen.
  • 【coze扣子】第1篇:coze快速入门
  • 威胁情报:Solana 开源机器人盗币分析
  • 以Java程序员角度理解MCP
  • 学习游戏制作记录(战斗系统简述以及击中效果)7.22
  • [c++11]std::function/bind