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录屏的三个方法,以及它们的优势和适…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...