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

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.xdnf.cn/news/15931.html

相关文章:

  • ospf技术
  • 【SpringAI实战】实现仿DeepSeek页面对话机器人
  • Jiasou TideFlow AIGC SEO Agent:全自动外链构建技术重构智能营销新标准
  • 技术与情感交织的一生 (十)
  • Spring处理器和Bean的生命周期
  • LinkedList与链表(单向)(Java实现)
  • 【2025/07/21】GitHub 今日热门项目
  • WinForm-免费,可商用的WinForm UI框架推荐
  • Linux 命令大全
  • Three.js实现银河流光粒子星空特效原理与实践
  • 【Android】交叉编译faiss库 | 问题解决
  • 【HarmonyOS】ArkTS语法详细解析
  • C++ <继承> 详解
  • Java IO流体系详解:字节流、字符流与NIO/BIO对比及文件拷贝实践
  • kafka 生产和消费 性能测试工具 kafka-producer-perf-test.sh kafka-consumer-perf-test.sh
  • 安装docker可视化工具 Portainer中文版(ubuntu上演示,所有docker通用) 支持控制各种容器,容器操作简单化 降低容器门槛
  • 2025最新版IntelliJ IDEA Ultimate for Mac专业版安装使用指南
  • C#最佳实践:为何应尽量减少静态类的使用
  • 【PTA数据结构 | C语言版】旅游规划
  • WSL如何安装docker?
  • 基于ArcFace损失函数训练的人脸特征提取模型
  • nextjs+react接口会请求两次?
  • UART串口
  • 【Git#6】多人协作 企业级开发模型
  • 多线程Python爬虫:加速大规模学术文献采集
  • 前端之学习后端java小白(一)之SDKMAN及helloword
  • 【深度学习新浪潮】如何系统性地学习扩散模型?
  • 影刀 RPA:批量修改 Word 文档格式,高效便捷省时省力
  • Elasticsearch X-Pack安全功能未启用的解决方案
  • MySQL索引失效常见场景总结