当前位置:网站首页>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的数据也没效果了。
边栏推荐
猜你喜欢
随机推荐
Redis:哨兵
Don't look down upon the WebSocket!Long connection, stateful, two-way, full-duplex king is Fried
丙二醇二乙酸酯(Propylene Glycol Diacetate)
软件测试技术之如何编写测试用例(3)
openresty 高可用部署
Web项目Controller统一返回实体类
ImportError: /lib/libgdal.so.26: undefined symbol: sqlite3_column_table_name
使用安全浏览器将网页保存为pdf的方法步骤
Bytes to beat three sides take offer: network + GC + + IO + redis + JVM red-black tree + data structure, to help you quickly into the giant!!!!!
15、学习MySQL NULL 值处理
Chrome浏览器开发新截图工具,安全浏览器截图方法
七夕之前,终于整出了带AI的美丽秘笈
实时渲染器不止lumion,Chaos Vantage你值得一试
二叉树求和路径问题解答与注记
mysql跨库关联查询(dblink)
C#将位图旋转90度
梅科尔工作室-14天华为培训六
Rust:多线程并发编程
JumpServer开源堡垒机完成龙芯架构兼容性认证
[Notes] Introduction to machine learning









