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

概述

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

关于memory_order

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

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

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

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

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

测试Demo1

#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>
#include <vector>std::atomic<bool> running{true};
std::atomic<int> counter{0};void worker() {while(running) {counter.fetch_add(1, std::memory_order_relaxed);}
}int main() {std::thread worker1(worker);std::thread worker2(worker);std::this_thread::sleep_for(std::chrono::seconds(1));running = false;worker1.join();worker2.join();std::cout << "Counter: " << counter << std::endl;
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/505460.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端打包部署(黑马学习笔记)

我们的前端工程开发好了&#xff0c;但是我们需要发布&#xff0c;那么如何发布呢&#xff1f;主要分为2步&#xff1a; 1.前端工程打包 2.通过nginx服务器发布前端工程 前端工程打包 接下来我们先来对前端工程进行打包 我们直接通过VS Code的NPM脚本中提供的build按钮来完…

逻辑漏洞(pikachu)

#水平&#xff0c;垂直越权&#xff0c;未授权访问 通过个更换某个id之类的身份标识&#xff0c;从而使A账号获取&#xff08;修改、删除&#xff09;B账号数据 使用低权限身份的账号&#xff0c;发送高权限账号才能有的请求&#xff0c;获得其高权限操作 通过删除请求中的认…

Linux查看进程和线程

根据PID查看进程 查找到进程的PID&#xff0c;以查看端口占用为例 lsof -i:8080 根据PID查看进程信息 lsof -p 5807或ll /proc/5807/ /proc/5807/目录下部分子目录说明 cwd 进程运行目录 exe 执行程序的绝对路径 cmdline 程序运行时输入的命令行命令 environ 记录了进程运行…

chromedriver,Chrome驱动的实时更新

发现自己的selenium项目跑不起来了 效验驱动版本 下载链接(可能需要魔法) https://registry.npmmirror.com/binary.html?pathchromedriver/ https://googlechromelabs.github.io/chrome-for-testing/ 找到驱动位置 1. 默认安装路径&#xff1a;Chrome驱动通常会默认安装在系…

数字化转型导师坚鹏:BLM证券公司数字化转型战略

BLM证券公司数字化转型战略 ——以BLM模型为核心&#xff0c;实现知行果合一 课程背景&#xff1a; 很多证券公司存在以下问题&#xff1a; 不知道如何系统地制定证券公司数字化转型战略&#xff1f; 不清楚其它证券公司数字化转型战略是如何制定的&#xff1f; 不知道…

五种IO模型

1.阻塞IO 阻塞 IO: 在内核将数据准备好之前 , 系统调用会一直等待 . 所有的套接字 , 默认都是阻塞方式 . 阻塞IO是最常见的IO模型. 2.非阻塞IO 非阻塞 IO: 如果内核还未将数据准备好 , 系统调用仍然会直接返回 , 并且返回 EWOULDBLOCK 错误码 . 非阻塞 IO 往往需要程序…

2024年 前端JavaScript Web APIs 第二天 笔记

Web APIs 第二天 2.1 -事件监听以及案例 2.2 -随机点名案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…

信号系统之复数

1 复数系统 为了说明复杂的数字&#xff0c;考虑一个孩子向空中扔球。假设球是直接向上扔的&#xff0c;初始值速度为每秒9.8米。一秒钟后&#xff0c;球已经达到了4.9米的高度&#xff0c;并且加速度为重力&#xff08;每秒9.8米2&#xff09;已将其速度降至零。球然后向地面…

(四)优化函数,学习速率与反向传播算法--九五小庞

多层感知器 梯度下降算法 梯度的输出向量表明了在每个位置损失函数增长最快的方向&#xff0c;可将它视为表示了在函数的每个位置向那个方向移动函数值可以增长。 曲线对应于损失函数。点表示权值的当前值&#xff0c;即现在所在的位置。梯度用箭头表示&#xff0c;表明为了增…

【Spring Boot 3】的安全防线:整合 【Spring Security 6】

简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多&#xff0c;因为相比与Sp…

Vivado的DocNav打不开,报错:Premature end of document, found at line number 1

需确认软件版本是否支持电脑系统版本&#xff0c;目前 2023.2 DocNav版本是支持win11 22H2&#xff1b;下载了2023.2版本&#xff0c;安装过程中重新安装DocNav。再打开DocNav&#xff0c;然后更新DocNav左上角的Catalog到最新就好了&#xff08;此时要开全局代理&#xff09;。…

LeetCode 热题 100 | 图论(一)

目录 1 200. 岛屿数量 2 994. 腐烂的橘子 2.1 智障遍历法 2.2 仿层序遍历法 菜鸟做题&#xff0c;语言是 C 1 200. 岛屿数量 解题思路&#xff1a; 遍历二维数组&#xff0c;寻找 “1”&#xff08;若找到则岛屿数量 1&#xff09;寻找与当前 “1” 直接或间接连接在…