• 基于原子变量的内存模型优化


    概述

    线程间同步通常的实现方法通常为互斥锁,但互斥锁对性能造成了影响,C++11引入了内存模型,定义了STD::memory_order枚举,结合原子性操作,实现无锁线程数据同步。

    关于memory_order

    memory_order_relaxed:针对当前的读写操作仅能保持原子性,但是不能保证顺序。

    memory_order_acquire:有此内存顺序的加载操作,在其影响的内存位置进行获得操作,当前线程中读或写不能被重排到此加载前。

    memory_order_release:有此内存顺序的存储操作进行释放操作,当前线程中的读或者写不能被重排到此存储后。

    memory_order_seq_cst:原子操作不仅以与释放/获得顺序相同的方式排序内容(在一个线程中先发生于存储的任何结果都变成进行加载的线程的可见副效应),目前方法默认为该属性。

    1. typedef enum memory_order {
    2. memory_order_relaxed,//宽松操作,没有同步或顺序制约,仅原子性
    3. memory_order_consume,
    4. memory_order_acquire,//本线程中,所有后续的读操作必须在本条原子操作完成后执行
    5. memory_order_release,//本线程中,所有之前的写操作完成后才能执行本条原子操作
    6. memory_order_acq_rel,//同时包含acquire和release
    7. memory_order_seq_cst//全部存取都按照顺序执行
    8. } memory_order;

    测试Demo1

    1. #include <atomic>
    2. #include <chrono>
    3. #include <iostream>
    4. #include <thread>
    5. #include <vector>
    6. std::atomic<bool> running{true};
    7. std::atomic<int> counter{0};
    8. void worker() {
    9. while(running) {
    10. counter.fetch_add(1, std::memory_order_relaxed);
    11. }
    12. }
    13. int main() {
    14. std::thread worker1(worker);
    15. std::thread worker2(worker);
    16. std::this_thread::sleep_for(std::chrono::seconds(1));
    17. running = false;
    18. worker1.join();
    19. worker2.join();
    20. std::cout << "Counter: " << counter << std::endl;
    21. }

    我公司承接各类技术服务,主要聚焦于:stm32、单片机、嵌入式、QT应用开发、Web+Python+Django应用开发。欢迎合作。

  • 相关阅读:
    创新案例|市值$400亿的设计平台Canva的增长策略
    44 mysql batch insert 的实现
    R函数optim()最小化或者最大化多参数函数
    【视频】人工智能AI、大数据与消费者洞察报告PPT
    mac vscode没有写入权限/无法自动更新
    MySQL(十四)分析查询语句Explain 七千字总结
    数组和链表
    Ansible自动化部署安装openGauss3.1企业版单机
    Visual Studio2019报错
    Python之wxPython事件处理
  • 原文地址:https://blog.csdn.net/hansen_education/article/details/136409707