当前位置:网站首页>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的数据也没效果了。
边栏推荐
猜你喜欢
随机推荐
Chrome浏览器开发新截图工具,安全浏览器截图方法
设备树基本原理与操作方法
With the help of Kubernetes kubekey speed installation
PreFixSum前缀和
POJ 2377 Bad Cowtractors(最大生成树)
ImportError: /lib/libgdal.so.26: undefined symbol: sqlite3_column_table_name
87.(cesium之家)cesium热力图(贴地形)
Compose原理-compose中是如何实现事件分法的
【C语言学习笔记(五)】while循环与for循环
CC2530_ZigBee+华为云IOT:设计一套属于自己的冷链采集系统
货比四家 version tb1.63
C#将位图旋转90度
【QT】入门心法
warnings.warn(“Title is more than 31 characters. Some applications may not be able to read the file
MySQL【变量、流程控制与游标】
VsCode preview Geojson data
【Azure 事件中心】使用Azure AD认证方式创建Event Hub Consume Client + 自定义Event Position
系统太多,多账号互通如何实现?
【C语言学习笔记(六)】分支与跳转(if、else、continue、break、switch)
金鱼哥RHCA回忆录:CL210管理计算资源--管理计算节点+章节实验
![选出表中的中位数记录[构造左右边界 || 问题转换]](/img/02/8d8e515c994c8a1a364f1e299d73f7.png)








