muduo源码学习base——Atomic(原子操作与原子整数)
Atomic(原子操作与原子整数)
- 前置知识
- AtomicIntegerT
- get()
- getAndAdd()
- getAndSet()
- 关于原子操作实现无锁队列(lock-free-queue)
前置知识
happens-before:
- 用来描述两个操作的内存可见性 如果操作 X happens-before 操作 Y,那么 X 的结果对于 Y 可见
六种内存序:
typedef enum memory_order {memory_order_relaxed, // relaxed不对执行顺序做保证memory_order_consume, // consume暂时不鼓励使用 memory_order_consumememory_order_acquire, // acquire本线程中,所有后续的读操作必须在本条原子操作完成后执行memory_order_release, // release本线程中,所有之前的写操作完成后才能执行本条原子操作memory_order_acq_rel, // acquire/release同时包含memory_order_acquire 和 memory_order_releasememory_order_seq_cst // sequentially consistent保证指令的顺序一致执行,不打开编译器优化指令,按照正常的指令序执行 } memory_order;gcc的原子操作__sync_(不推荐):使用这些原子操作gcc编译时要加上选项 -march=cpu-type
bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)
比较*ptr与oldval的值,如果相等则将newval更新到*ptr并返回truetype __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)
比较*ptr与oldval的值,如果相等则将newval更新到*ptr并返回操作之前*ptr的值type __sync_fetch_and_add (type *ptr, type value, ...)加,返回更新前的值type __sync_fetch_and_sub (type *ptr, type value, ...)减type __sync_fetch_and_or (type *ptr, type value, ...)或type __sync_fetch_and_and (type *ptr, type value, ...)与type __sync_fetch_and_xor (type *ptr, type value, ...)异或type __sync_fetch_and_nand (type *ptr, type value, ...)与非type __sync_add_and_fetch (type *ptr, type value, ...)返回更新后的值type __sync_sub_and_fetch (type *ptr, type value, ...)type __sync_or_and_fetch (type *ptr, type value, ...)type __sync_and_and_fetch (type *ptr, type value, ...)type __sync_xor_and_fetch (type *ptr, type value, ...)type __sync_nand_and_fetch (type *ptr, type value, ...)原子操作__atomic:(C++11后推荐,使用内存序)
type __atomic_add_fetch(type *ptr, type val, int memorder)type __atomic_sub_fetch(type *ptr, type val, int memorder)type __atomic_and_fetch(type *ptr, type val, int memorder)type __atomic_xor_fetch(type *ptr, type val, int memorder)type __atomic_or_fetch(type *ptr, type val, int memorder)type __atomic_nand_fetch(type *ptr, type val, int memorder)type __atomic_fetch_add(type *ptr, type val, int memorder)type __atomic_fetch_sub(type *ptr, type val, int memorder)type __atomic_fetch_and(type *ptr, type val, int memorder)type __atomic_fetch_xor(type *ptr, type val, int memorder)type __atomic_fetch_or(type *ptr, type val, int memorder)type __atomic_fetch_nand(type *ptr, type val, int memorder)type __atomic_load_n (type *ptr,int memorder);_n表示加不加字节序memorder,void__atomic_store_n (type *ptr, type val,int memorder);type __atomic_exchange_n (type *ptr, type val,int memorder);bool__atomic_compare_exchange_n (type *ptr, type *expected, type desired,bool weak, int success_memorder,int failure_memorder);bool __atomic_test_and_set (void *ptr, int memorder)原子地更改 obj 所指向的 atomic_flag 的状态为设置( true )void __atomic_clear (bool *ptr, int memorder)void __atomic_thread_fence (int memorder)bool __atomic_always_lock_free (size_t size, void *ptr)bool __atomic_is_lock_free (size_t size, void *ptr)
谷歌规范const常量命名加k:const int kvalue
关于gcc的编译告警选项:
AtomicIntegerT
muduo::detail::AtomicIntegerT是noncopyable的派生类,不可拷贝
class AtomicIntegerT : noncopyable类图:
- volatile T value_: 用于原子操作的value_值,volatile表示直接从内存取,不从寄存器取,与该变量有关的运算,不要进行编译优化,以免出错
- 所有其他成员函数都是通过get(), getAndAdd(), getAndSet()来实现的
get()
T get() {// in gcc >= 4.7: __atomic_load_n(&value_, __ATOMIC_SEQ_CST)return __sync_val_compare_and_swap(&value_, 0, 0); }注意选项-march=cpu-type
getAndAdd()
T getAndAdd(T x) {// in gcc >= 4.7: __atomic_fetch_add(&value_, x, __ATOMIC_SEQ_CST)return __sync_fetch_and_add(&value_, x); }注意选项-march=cpu-type
getAndSet()
T getAndSet(T newValue) {// in gcc >= 4.7: __atomic_exchange_n(&value_, newValue, __ATOMIC_SEQ_CST)return __sync_lock_test_and_set(&value_, newValue); }注意选项-march=cpu-type
关于原子操作实现无锁队列(lock-free-queue)
无锁队列的实现
相关文章:
muduo源码学习base——Atomic(原子操作与原子整数)
Atomic(原子操作与原子整数) 前置知识AtomicIntegerTget()getAndAdd()getAndSet() 关于原子操作实现无锁队列(lock-free-queue) 前置知识 happens-before: 用来描述两个操作的内存可见性 如果操作 X happens-before 操作 Y,那么 X 的结果对于…...
最短路相关笔记
Floyd Floyd 算法,是一种在图中求任意两点间最短路径的算法。 Floyd 算法适用于求解无负边权回路的图。 时间复杂度为 O ( n 3 ) O(n^3) O(n3),空间复杂度 O ( n 2 ) O(n^2) O(n2)。 对于两点 ( i , j ) (i,j) (i,j) 之间的最短路径,有…...
Web前端-Vue2+Vue3基础入门到实战项目-Day5(自定义指令, 插槽, 案例商品列表, 路由入门)
自定义指令 基本使用 自定义指令: 自己定义的指令, 可以封装一些dom操作, 扩展额外功能全局注册// 1. 全局注册指令 Vue.directive(focus, {// inserted 会在 指令所在的元素, 被插入到页面中时触发inserted (el) {// el 就是指令所绑定的元素// console.log(el)el.focus()} …...
mysql json数据类型 相关函数
创建JSON文本的函数 1.JSON_ARRAY(转换json数组) 2.JSON_OBJECT(转换json对象) 3.JSON_QUOTE(转义字符串) 搜索JSON文本的函数 1.JSON_CONTAINS(json当中是否包含指定value) 2.J…...
如何实现前端实时通信(WebSocket、Socket.io等)?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...
使用 SSSD 进行网络用户身份验证
文章目录 使用 SSSD 进行网络用户身份验证SSSD和Active Directory先决条件、假设和要求软件安装加域 SSSD配置自动创建HOME目录 检查和验证 Kerberos票证已知的问题参考 使用 SSSD 进行网络用户身份验证 SSSD 代表系统安全服务守护程序,它实际上是处理来自各种网络…...
紫光展锐携中国联通完成RedCap芯片V517孵化测试
近日,紫光展锐携手中国联通5G物联网OPENLAB开放实验室(简称“OPENLAB实验室”)共同完成RedCap芯片V517创新孵化,并实现在联通5G全频段3.5GHz、2.1GHz、900MHz下的端到端业务验证测试。 V517是一款基于紫光展锐5G成熟平台设计与研发…...
算法通关村第十一关青铜挑战——移位运算详解
大家好,我是怒码少年小码。 计算机到底是怎么处理数字的? 数字在计算机中的表示 机器数 一个数在计算机中的二进制表示形式,叫做这个数的机器数。 机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0&am…...
2023年面试测试工程师一般问什么问题?
面试和项目一起,是自学路上的两大拦路虎。面试测试工程师一般会被问什么问题,总结下来一般是下面这4类: 1.做好自我介绍 2.项目相关问题 3.技术相关问题 4.人事相关问题 接下来,主要从以上四个方向分别展开介绍。为了让大家更有获…...
2023年中国汽车覆盖件模具竞争格局、市场规模及行业需求前景[图]
汽车覆盖件模具是汽车车身生产的重要工艺装备,其设计和制造时间约占汽车开发周期的 2/3,是汽车换型的重要制约因素之一。汽车覆盖件模具具有尺寸大、工作型面复杂、技术标准高等特点,属于技术密集型产品。汽车覆盖件模具按以其冲压的汽车覆盖…...
vue3项目运行报错import zhCn from “element-plus/lib/locale/lang/zh-cn“
解决办法 import zhCn from "element-plus/lib/locale/lang/zh-cn";修改为 import zhCn from "element-plus/dist/locale/zh-cn.mjs";...
读书笔记:Effective C++ 2.0 版,条款26(歧义)、条款27(禁止部分隐式生成的函数)
条款26: 当心潜在的歧义 即使cpp支持潜在二义性/歧义,也不要使用。 void f(int); void f(char); double d 6.02; f(d); //需要明确转换多继承充满了潜在二义性/歧义的可能。 class Base1 {public: int doIt();}; class Base2 {public: void doIt();}; class Deri…...
MySQL基本操作之数据库设计理论
1、数据的设计准则 1)糟糕的数据库设计表现在以下几个方面: 访问数据效率低下存在大量的数据冗余,浪费存储空间更新和检索数据时会出现许多问题2)良好的数据库设计表现在以下几方面: 访问效率高减少数据冗余,节省存储空间便于进一步扩展可以使应用程序的开发变得更容易…...
SpringBoot的日志系统(日志分组、文件输出、滚动归档)
[toc](目录) > SpringBoot3需要jdk17 # 1. 简介 1. Spring5及以后Spring自己实现了commons-logging,来作为内部的日志。日志的jar包是org.springframework:spring-jcl:6.0.10。查看org.apache.commons.logging.LogAdapter Java package org.apache.commons.log…...
一种基于HTTPS实现的Web账号登录Linux桌面系统的实现方案
问题由来 客户需求计划列入支持第三方帐号系统,包括Web账号。需求来源是用户想要用它们的帐号直接登录Linux Deepin操作系统。一个失败的实现方案是用户以较小的成本改造帐号管理系统发布HTTP服务,我们开发一个PAM模块与Web服务器交互,数据格…...
【Linux】psplash制作Linux开机动画
1. 下载psplash软件 下载psplash源码到ubuntu中: 下载地址:https://git.yoctoproject.org/psplash/commit/安装依赖环境 sudo apt-get install libgdk-pixbuf2.0-dev2. 准备图片 开机动画静态图片:psplash-poky.png开机动画进度条图片&…...
WMS透明仓库:实现仓储的全方位可视化与优化
一、WMS透明仓库的定义与特点 1. WMS透明仓库的定义:WMS透明仓库是一种基于信息技术的仓库管理系统,通过实时数据采集、分析和可视化,将仓库内外的物流流程、库存状态、人员活动等信息以透明的方式展示给相关利益方。 2. 实时数据采集&…...
软考系统架构师知识点集锦一:系统工程与信息系统基础
一、考情分析 二、考点精讲 2.1 软件开发方法 (1)结构化开发方法 用户至上,自顶向下,逐步分解(求解),严格区分工作阶段,每阶段有任务与成果,强调系统开发过程的整体性和全局性,系统开发过程工…...
建筑模板常见的问题有哪些?
在建筑模板的使用过程中,常见的问题包括以下几个方面:1. 模板质量问题: - 模板破损或变形:模板可能在运输、安装或使用过程中受到损坏,如裂缝、断裂或变形。这可能导致模板的稳定性和承载能力下降。 - 模板尺寸不准确&…...
windows11录屏功能详解,记录你的精彩时刻
windows 11是微软最新推出的操作系统版本,拥有很多简单便捷的功能,包括内置的录屏工具,让用户可以轻松地录制屏幕内容。但是很多人不了解windows11录屏功能,本文将详细介绍windows 11录屏的三个方法,以及它们的优势和适…...
MoCo训练完全指南:从入门到精通的10个常见错误与解决方案
MoCo训练完全指南:从入门到精通的10个常见错误与解决方案 【免费下载链接】moco PyTorch implementation of MoCo: https://arxiv.org/abs/1911.05722 项目地址: https://gitcode.com/gh_mirrors/mo/moco MoCo(Momentum Contrast)是自…...
给电表软件工程师的DLMS/COSEM实战指南:从OBIS码解析到HDLC帧抓包
给电表软件工程师的DLMS/COSEM实战指南:从OBIS码解析到HDLC帧抓包 在智能电表与能源物联网领域,DLMS/COSEM协议栈如同电力系统的"普通话",让不同厂商的设备能够无缝对话。但对于一线开发者而言,官方规范文档动辄上千页…...
OpenClaw飞书机器人配置:Qwen3.5-9B多轮对话实战
OpenClaw飞书机器人配置:Qwen3.5-9B多轮对话实战 1. 为什么选择OpenClaw飞书Qwen3.5-9B组合 去年我接手了一个小团队的内部效率优化项目,需要在不增加人力的情况下提升日常事务处理速度。经过几轮技术选型,最终选择了OpenClaw作为自动化核心…...
i.MX6ULL裸机开发避坑指南:从start.S汇编到main.c跳转,这些细节你注意了吗?
i.MX6ULL裸机开发实战避坑:从启动汇编到C环境的完美跳转 当一块i.MX6ULL开发板首次通电时,处理器并不知道从哪里开始执行指令。这个看似简单的过程背后,隐藏着嵌入式工程师必须直面的底层细节——如何确保汇编启动代码正确建立C语言运行环境&…...
使用OpenScreen,轻松创建精美演示文稿!
OpenScreen:免费开源的屏幕录制工具 在当今数字化时代,制作产品演示和操作教程成为了工作和学习的重要组成部分。然而,许多优质的屏幕录制软件却高昂的订阅费用让普通用户望而却步。今天,我为大家介绍一个免费的开源工具——OpenScreen,旨在为用户提供一个简化且直观的屏…...
nli-distilroberta-base数据库智能查询:自然语言问题与SQL语句的蕴含关系判断
NLI-DistilRoBERTa-base数据库智能查询:自然语言问题与SQL语句的蕴含关系判断 1. 场景痛点:数据库查询中的语义鸿沟 想象一下这样的场景:一位市场部门的同事想查询"上个月销售额超过10万元且复购率高于30%的客户名单"。他打开数据…...
S2-Pro Java项目开发实战:SpringBoot微服务集成AI能力
S2-Pro Java项目开发实战:SpringBoot微服务集成AI能力 1. 企业级Java项目如何拥抱AI能力 最近两年,AI技术在企业应用中的渗透率显著提升。作为Java开发者,我们经常面临这样的需求:如何在现有SpringBoot微服务架构中快速集成AI能…...
LangGraph从入门到精通(二)——构建你的第一个有状态智能体
1. 环境准备与基础概念回顾 在开始构建有状态智能体之前,我们需要先确保开发环境就绪。我推荐使用Python 3.10版本,这个版本在稳定性和新特性支持上达到了很好的平衡。安装LangGraph非常简单,只需要一条命令: pip install langgra…...
AI应用开发入门(0)|为什么你学了很多,却还是不会做AI应用?
这段时间在系统学习 AI 应用开发的过程中,我逐渐有一个比较强烈的感受:相关内容其实并不少,但真正能把“整个路径讲清楚”的并不多。你可能也有类似的经历。✔ 看了很多 Prompt、RAG、Agent 的文章,当时感觉都懂了 ✔ 跟着教程做…...
电压电流双闭环Vienna整流器SVPWM调制仿真研究
基于电压电流双闭环的vienna整流器的仿真(SVPWM调制)最近在实验室折腾Vienna整流器,双闭环调得我差点把示波器砸了。这玩意儿看着电路拓扑对称美如画,真调起来参数互相打架是常态。今天就结合仿真说说怎么让电压电流双闭环稳住,顺便把SVPWM那…...

