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

c++中如何保持结构体的线程安全?3D坐标的线程安全:从理论到最优解

使用mutex的困扰

struct Point3d {
    std::mutex mtx;
    double x, y, z;
    
    void set(double nx, double ny, double nz) {
        std::lock_guard<std::mutex> lock(mtx);
        x = nx; y = ny; z = nz;
    }
};

这种方案虽然安全,但性能开销确实不小。每次访问都需要加锁解锁,在高频访问场景下会造成明显的性能瓶颈。

atomic的局限性

struct Point3d {
    std::atomic<double> x, y, z;
};

看似完美,但实际使用中会发现:原子操作虽然保证了单个坐标的线程安全,但无法保证三个坐标更新的原子性。

更好的解决方案

双缓冲技术(推荐)

struct Point3d {
    struct Data {
        double x, y, z;
    };
    std::array<Data, 2> buffers;
    std::atomic<int> current{0};
    
    void set(double nx, double ny, double nz) {
        int next = (current + 1) % 2;
        buffers[next] = {nx, ny, nz};
        current.store(next, std::memory_order_release);
    }
    
    Data get() const {
        return buffers[current.load(std::memory_order_acquire)];
    }
};

无锁CAS方案

struct Point3d {
    struct alignas(16) Data {
        double x, y, z;
    };
    std::atomic<Data> data;
    
    void set(double nx, double ny, double nz) {
        Data newData = {nx, ny, nz};
        Data oldData = data.load();
        while(!data.compare_exchange_weak(oldData, newData));
    }
}; 
  • mutex方案:平均延迟 500ns
  • 双缓冲方案:平均延迟 50ns
  • CAS方案:平均延迟 30ns(无竞争),200ns(高竞争)

在处理3D坐标这类需要保持原子性的小型数据结构时,双缓冲方案往往是最佳选择。它不仅实现简单,而且能在性能和安全性之间取得很好的平衡。

"过度优化是万恶之源,但合适的优化是智慧的结晶。"

http://www.kler.cn/a/443913.html

相关文章:

  • 基于Spring Boot的智慧农业专家远程指导系统
  • 基于SpringBoot+Vue实现的个人备忘录系统
  • 坑人 C# MySql.Data SDK
  • qlib优缺点
  • 基于Arduino的平衡车机械臂
  • 项目管理工具Maven(一)
  • 【myXdb.stop()关闭时保存数据流程分析】xdb关服时数据落地源码
  • 基于阿里云日志服务的程序优化策略与实践
  • 关于目标检测YOLO 各版本区别v1-v11/X/R/P
  • go语言并发读写数据队列,不停写的同时,一次最多读取指定量数据(逐行注释)
  • 【自动驾驶】Ubuntu20.04安装ROS1 Noetic
  • 在C#中,可以通过使用委托(delegate)或者是事件(event)来将方法作为参数传递。
  • Redis篇-14--数据结构篇6--Set内存模型(整数集合intset,哈希表hashtable)
  • 爬虫可能会遇到哪些反爬措施?
  • 【AI热点】小型语言模型(SLM)的崛起:如何在AI时代中找到你的“左膀右臂”?
  • 在 Go 中利用 ffmpeg 进行视频和音频处理
  • Java web概述
  • v-html详细解析与代码实例
  • GB_T 38636 《信息安全技术 传输层密码协议(TLCP)》题目
  • 如何在OneNote中高效使用copilot
  • Pytorch中关于Tensor的操作
  • 基于vue3实现小程序手机号一键登录
  • 常用的前端框架介绍
  • 蓝桥杯摆烂第三天
  • AutoMQ 流表一体新特性 Table Topic 发布: 无缝集成 AWS S3 Table 和 Iceberg
  • Ubuntu本地化安装MYSQL及Navicat