muduo源码学习base——Atomic(原子操作与原子整数)

news2025/1/13 7:55:38

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_consume
   memory_order_acquire,   // acquire本线程中,所有后续的读操作必须在本条原子操作完成后执行
   memory_order_release,   // release本线程中,所有之前的写操作完成后才能执行本条原子操作
   memory_order_acq_rel,   // acquire/release同时包含memory_order_acquire 和 memory_order_release
   memory_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并返回true
  • type __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)

无锁队列的实现

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

极智AI | 有趣的羊驼系列大模型

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文来介绍一下 有趣的羊驼系列大模型。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq "羊驼模型" 在大模型的介绍中应…

CodeWhisperer proxy代理连不上(解决)

报错: 2023-10-24 14:15:50 [INFO]: selected AWS ID sign in 2023-10-24 14:15:50 [ERROR]: API response (oidc.us-east-1.amazonaws.com /device_authorization): {} 2023-10-24 14:15:50 [ERROR]: webviewId"authWebview": Error: Webview error->…

【外汇天眼】很多交易高手都容易忽视的问题:“路径依赖”!

一、“路径依赖”与“均值回归” 在过去五到十年内,如果你一直通过采用某一策略取得持续的超额收益,那么你很难认识到这种策略可能出现错误。 即使经历了一两年的失效,大多数人都会继续相信并采用这一策略。这受到沉没成本、个人声誉以及多种…

Android Apk一键打包上传至蒲公英平台的gradle脚本

一、背景 项目中每次手动打包后,生成的测试包,都需要手动打开蒲公英平台的网址,登录账号,手动上传apk。之前写过一键上传至fir平台的脚本,想着这次可以搞一下一键打包上传至蒲公英的gradle脚本,提高下工作…

Linux下QT打开文件选择对话框时,程序报错退出

系统:Ubuntu QString fileName QFileDialog::getOpenFileName(this, "open", "./", "document Files (*.pdf)"); 调用该语句弹出文件对话框时,程序崩溃退出 错误提示: (Widget:5272): Gtk-WARNING **: 14…

73 应急响应-WEB分析phpjavaweb自动化工具

目录 应急响应:必备知识点:准备工作:有明确信息网站被入侵:无明确信息网站被入侵:常见分析方法: 演示案例:WindowsIISSql-日志,搜索LinuxBT_Nginxtp5-日志,后门360星图日志自动分析工…

Spring Cloud之服务注册与发现(Eureka)

目录 Eureka 介绍 角色 实现流程 单机构建 注册中心 服务提供者 服务消费者 集群搭建 注册中心 服务提供者 自我保护机制 原理分析 Eureka 介绍 Eureka是spring cloud中的一个负责服务注册与发现的组件,本身是基于REST的服务,同时还提供了…

虚拟化 vs. 裸金属:K8s 部署环境架构与特性对比

伴随着 IT 云化转型的逐步推进,越来越多的用户加入应用容器化改造的行列,并使用 Kubernetes(K8s)进行容器部署管理。然而,令不少用户感到困惑的是,由于大部分应用此前都部署在虚拟化或超融合环境&#xff0…

批量处理图片,轻松转换JPG到TIFF,让你的图片管理更优化!

作为图片处理的专业人士,您可能经常需要处理大量的图片文件,其中包括各种不同的格式,如JPG、PNG、GIF等。然而,不同的格式有着不同的优缺点,有时候为了更好地保存和传输图片,您可能需要将其转换为其他格式。…

NEFU系统分析与设计

系统分析与设计概述 用户故事 用来描述用户希望得到的功能 三要素:角色、活动、商业价值 举例:作为一个“网站管理员”,我想要“统计每天有多少人访问了我的网站”,以便于“我的赞助商了解我的网站会给他们带来什么收益。 系统…

Jmeter(十二):线程组元件第三方插件的线程组压力和负载线程详解

线程组(thread group) 线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件 都必须在某个线程下。所有的任务都是基于线程组。 一个线程组可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一 个虚拟用户。多个用户同时去执行相同的一批次任…

升讯威在线客服系统的并发高性能数据处理技术:为多线程处理同步数据

我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户。对我来说,只要能获得用户的认可,就是我最大的动力。 最近客服系统成功经受住了客户现场组织的压力测试,获得了客户的认可。 客户组织多名客服上线后&a…

uniapp跨域

配置 /manifest.json "devServer" : { "https" : false, "port" : 7101, "proxy": { "/api": { "target": "https://域名", "changeOrigin": t…

3D模型如何添加表面贴图?

1、模型表面贴图介绍 模型表面贴图(Texture Mapping)是一种将纹理映射到三维模型表面的技术,用于增加模型的细节和真实感。它通过在模型的每个表面点上应用纹理坐标,并将纹理像素与模型的对应点进行匹配,使得模型表面…

elasticSearch put全局更新和单个字段更新语法

1、如下:更新改类型未doc(文档)的全局字段数据 注意:如果你使用的是上面的语句,但是只写了id和title并赋值,图片上其他字段没有填写,执行命令后,则会把原文档中的其他字段都给删除了,你会发现查…

prosemirror 学习记录(二)创建 apple 节点

apple type 向 schema 中添加 apple type const nodes {apple: {inline: true,attrs: {name: { default: "unknown" },},group: "inline",draggable: true,parseDOM: [{tag: "span[custom-node-typeapple]",getAttrs(dom) {return {name: dom…

【高效开发工具系列】Apifox

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

Vue单页面应用(SPA)怎么做SEO

在Vue单页面应用(SPA)中,由于内容的动态加载和路由切换,搜索引擎可能无法直接获取和索引页面的内容。不过,你可以采取一些策略来优化SEO,使你的Vue单页面应用在搜索引擎中更好地被索引和展示: 1:使用预渲染(Prerendering)或服务器端渲染(Server-Side Rendering,SS…

爬虫采集如何解决ip被限制的问题呢?

在进行爬虫采集的过程中,很多开发者会遇到IP被限制的问题,这给采集工作带来了很大的不便。那么,如何解决这个问题呢?下面我们将从以下几个方面进行探讨。 一、了解网站的反爬机制 首先,我们需要了解目标网站的反爬机制…

设计模式(13)适配器模式

一、介绍: 1、定义:是一种结构型设计模式,它可以将一个类的接口转换成客户端所期望的另一种接口。适配器模式常用于系统的不兼容性问题。 2、组成: (1)目标接口(Target)&#xff…