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

C++ 编程指南27 - 始终将 mutex 与它所保护的数据一起定义,并尽可能使用 synchronized_value<T>

一:概述

        在多线程编程中,互斥锁(std::mutex)的作用是保护共享数据的访问。但如果 mutex 和它保护的数据分开定义,可能会导致以下问题:

  1. 锁的使用不明显:程序员可能会忘记获取 mutex 就访问数据,导致数据竞争(race condition)。
  2. 锁管理混乱:代码阅读者难以明确哪个 mutex 保护哪个数据,可能会误用错误的 mutex,导致死锁或数据不一致。
  3. 封装性不足:数据和 mutex 分离,使得访问数据变得不安全。

二:反面示例代码

        在下面的代码中,  m 作为全局变量,与 shared_data 分开定义,代码阅读者无法一眼看出它们的关系。可能会出现开发人员在某处访问 shared_data 时忘记加锁,从而导致数据竞争。

#include <mutex>

std::mutex m;
int shared_data;  //  mutex 和数据分离了,容易误用

void update() {
    std::lock_guard<std::mutex> lk(m);
    shared_data++;  // 这里虽然正确加锁,但数据和锁分离,不直观
}

三:正确示例代码               

  在下面代码中,std::mutex m 就在数据 value 的旁边,让开发人员知道访问 value 时必须加锁。update() 方法显式地使用 lock_guard,确保 mutex 正确使用。

#include <mutex>

struct Record {
    std::mutex m;   // 明确表示需要加锁
    int value;

    void update() {
        std::lock_guard<std::mutex> lk(m);
        value++;
    }
};

         C++ 标准委员会(WG21)提议引入 synchronized_value<T>,它会自动管理 mutex 并提供安全的数据访问,避免手动锁管理的错误。在 C++23 及以后,如果 synchronized_value<T> 可用,优先使用它!

#include <syncstream>  // C++23 标准库

class MyClass {
    struct DataRecord {
        int x;
        void increment() { x++; }
    };

    std::synchronized_value<DataRecord> data;  //  由 synchronized_value 自动管理锁

public:
    void update() {
        data->increment();  // 访问 data 时自动加锁
    }
};

相关文章:

  • Linux网络 五种 IO 模型
  • Netty基础—2.网络编程基础四
  • Linux运维(三)Linux命令行操作:从菜鸟到高手
  • 【性能测试】Jmeter如何做一份测试报告(3)
  • C++ 布尔类型(bool)深度解析
  • PHP+redis 优雅实现加锁机制
  • RedHatLinux的第一次作业
  • 单片机OTA升级中Bootloader怎么判断APP有没有问题?
  • java的字符串,数组,集合的长度/大小
  • 通用人工智能(AGI):定义、挑战与未来展望
  • 关于ngx-datatable no data empty message自定义模板解决方案
  • 在虚拟机VMware上安装CENTOS7-图文教程
  • 【iOS逆向与安全】sms短信转发插件与上传服务器开发
  • 解锁 Postman:下载安装与账户注册使用的全攻略,踏上测试新征程
  • 项目管理系统在制造企业 IPD 研发管理中的应用实践
  • 硬件电路 - 推挽(PP)输出与开漏(OD)输出的区别
  • ViM-UNet模型详解及代码复现
  • 如和实现一个服务器端高并发线程池
  • 【C++】滑动窗口算法
  • Kubernetes服务部署 —— Kafka
  • 私家车跑“顺风”出事故,意外险赔不赔?
  • 墨西哥海军一载两百余人帆船撞上纽约布鲁克林大桥,多人落水
  • 女排奥运冠军宋妮娜:青少年保持身心健康才能走得更远
  • 广西百色“致富果”:高品质芒果直供香港,带动近五千户增收
  • 商务部新闻发言人就出口管制管控名单答记者问
  • 马上评|安排见义勇为学生补考,善意与善意的双向奔赴