当前位置: 首页 > news >正文

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并返回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.lryc.cn/news/204290.html

相关文章:

  • 最短路相关笔记
  • Web前端-Vue2+Vue3基础入门到实战项目-Day5(自定义指令, 插槽, 案例商品列表, 路由入门)
  • mysql json数据类型 相关函数
  • 如何实现前端实时通信(WebSocket、Socket.io等)?
  • 使用 SSSD 进行网络用户身份验证
  • 紫光展锐携中国联通完成RedCap芯片V517孵化测试
  • 算法通关村第十一关青铜挑战——移位运算详解
  • 2023年面试测试工程师一般问什么问题?
  • 2023年中国汽车覆盖件模具竞争格局、市场规模及行业需求前景[图]
  • vue3项目运行报错import zhCn from “element-plus/lib/locale/lang/zh-cn“
  • 读书笔记:Effective C++ 2.0 版,条款26(歧义)、条款27(禁止部分隐式生成的函数)
  • MySQL基本操作之数据库设计理论
  • SpringBoot的日志系统(日志分组、文件输出、滚动归档)
  • 一种基于HTTPS实现的Web账号登录Linux桌面系统的实现方案
  • 【Linux】psplash制作Linux开机动画
  • WMS透明仓库:实现仓储的全方位可视化与优化
  • 软考系统架构师知识点集锦一:系统工程与信息系统基础
  • 建筑模板常见的问题有哪些?
  • windows11录屏功能详解,记录你的精彩时刻
  • 重入漏洞Victim
  • wordpress数据库迁移Invalid default value for ‘comment_date‘
  • Xray联动RAD实现自动扫描教程
  • ES6 Proxy
  • LSKA(大可分离核注意力):重新思考CNN大核注意力设计
  • muduo源码学习base——Exception(带 stack trace 的异常基类)
  • 2023-10-24 小总结
  • 2-MySQL的基本操作记录
  • 网站页脚展示备案号并在新标签页中打开超链接
  • CentOS7 安装 nodejs
  • 工程化测试:Apollo的单元测试与集成测试指南