当前位置:网站首页>Postgresql中的pg_memory_barrier_impl和C的volatile
Postgresql中的pg_memory_barrier_impl和C的volatile
2022-08-03 19:00:00 【mingjie】
PG中的pg_memory_barrier_impl
arch-x86.h中对内存屏障的定义:
#define pg_memory_barrier_impl() \
__asm__ __volatile__ ("lock; addl $0,0(%%rsp)" : : : "memory", "cc")
#endif
lock;addl是什么含义?
- lock后的所有写操作,会造成总线同步,也就是cpu store buffer会flush出,通过修改过的地址,使其他CPU对应的cacheline失效。
- 那么这个addl给rsp寄存器加0的操作(rsp堆栈指针指向volatile数据,去内存中取变量需要用rsp去找)虽然不会改变rsp的值,但会触发store buffer的flush动作,进而同步所有核心的cacheline数据。
- 最终的效果就是cacheline全部同步一遍,不会读到旧的值。
C的volatile
volatile修饰的值修改时,不会被编译器把变量装到寄存器中;如果不修饰,CPU可能会从寄存器中读取,也可能从内存中读取,两边并发读的结果可能会不一致。
(java的volatile可能自带asm(lock;addr)的功能,这里有差异)
区别
volatile阻止编译器把变量塞到寄存器里面,如果到寄存器里面,读的时候直接拿寄存器的值完全不走stroe buffer和缓存了,再做memory_barrier同步cacheline的数据也没效果了。
边栏推荐
猜你喜欢
YAML中多行字符串的配置方法:|+、 |、 |-、 >+、 >、 >-的区别
2022年最新的Android面试大厂必考174题(附带详细答案)
Shell编程案例
MySQL超详细安装教程 手把手教你安装MySQL到使用MySQL 最简单的MySQL安装方式,这种方式装,卸载也简单
online 方式创建索引触发trigger怎么办?
Zhong Hua, senior architect of Ali: China-Taiwan strategic thinking and architecture practice; including internal implementation manual
【HCIP】MPLS实验
【汇编语言02】第2章 寄存器——理论知识
flex布局
MySQL【变量、流程控制与游标】
随机推荐
基于DMS的数仓智能运维服务,知多少?
POJ 3041 Asteroids(最大匹配数=最小点覆盖)
七夕之前,终于整出了带AI的美丽秘笈
Shell:循环语句
pytest接口自动化测试框架 | Jenkins集成初探
Oracle 脚本实现简单的审计功能
OSError: [WinError 123] 文件名、目录名或卷标语法不正确
BinomialTree 二叉树
cocos creater 3.x 插件安装方法
YAML中多行字符串的配置方法:|+、 |、 |-、 >+、 >、 >-的区别
读取 resources 目录下的文件路径的九种方式,你知道多少?
【QT】入门心法
mysql跨库关联查询(dblink)
Selenium of reptiles
Blender script 删除所有幽灵对象
实时渲染器不止lumion,Chaos Vantage你值得一试
2022/08/02------Ugly number
【汇编语言02】第2章 寄存器——理论知识
BinaryIndexedTrees树状数组
高等数学---第十章无穷级数---常数项级数