当前位置:网站首页>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")
#endiflock;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的数据也没效果了。
边栏推荐
猜你喜欢

Flask框架——项目可安装化

微信小程序分享功能

MD5是对称加密还是非对称加密,有什么优缺点

MPLS的简单应用于实验

mysql跨库关联查询(dblink)

Cobalt Strike (CS) 逆向初探

Online monitoring of UPS power supply and operating environment in the computer room, the solution is here

【Azure 事件中心】使用Azure AD认证方式创建Event Hub Consume Client + 自定义Event Position

图像超分——Real-ESRGAN快速上手

Install porterLB
随机推荐
实现博客营销有哪些技巧
87. (Home of cesium) cesium heat map (topography)
excel写入不完全sheet.append方法(openpyxl)
高数---级数
typescript学习笔记
Higher mathematics - chapter ten infinite series - constant term series
Big guy, who is free to help me to see what the problem is, I just read MySQL source print, and I just came into contact with flink.
JumpServer开源堡垒机完成龙芯架构兼容性认证
C#将位图旋转90度
普通用户如何利用小红书赚钱呢?小红书的流量是真的吗?
懵逼!阿里一面被虐了,幸获内推华为技术四面,成功拿到offer,年薪40w
BinaryIndexedTrees树状数组
15、学习MySQL NULL 值处理
MySQL如何一劳永逸的永久支持输入中文
2022/08/02------Ugly number
2022年7月国产数据库大事记
When does MySQL use table locks and when to use row locks?You should know this
软件测试回归案例,什么是回归测试?
PHP基础笔记-NO.2
2022/08/02------丑数