当前位置:网站首页>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的数据也没效果了。
边栏推荐
- cocos creater 3.x 插件安装方法
- 货比四家 version tb1.63
- OneNote 教程,如何在 OneNote 中设置页面格式?
- With the help of Kubernetes kubekey speed installation
- 【HCIP】MPLS实验
- PreFixSum前缀和
- PHP base notes - NO. 1
- 国产虚拟化云宏CNware WinStack安装体验-5 开启集群HA
- Bytes to beat three sides take offer: network + GC + + IO + redis + JVM red-black tree + data structure, to help you quickly into the giant!!!!!
- How does MySQL permanently support Chinese input once and for all?
猜你喜欢
随机推荐
【HCIP】MPLS实验
普通用户如何利用小红书赚钱呢?小红书的流量是真的吗?
如何理解即时通讯开发移动网络的“弱”和“慢”
Web项目Controller统一返回实体类
Redis:哨兵
MySQL 啥时候用表锁,啥时候用行锁?这些你都应该知道吧
丙二醇二乙酸酯(Propylene Glycol Diacetate)
机器学习的方法总结
pytest接口自动化测试框架 | Jenkins集成初探
不要小看 WebSocket!长连接、有状态、双向、全双工都是王炸技能
MySQL如何 drop 大表
Chrome浏览器开发新截图工具,安全浏览器截图方法
15、学习MySQL NULL 值处理
[Notes] Introduction to machine learning
Cobalt Strike (CS) 逆向初探
POJ 2377 Bad Cowtractors(最大生成树)
online 方式创建索引触发trigger怎么办?
阿里二面:多线程间的通信方式有几种?举例说明
PHP基础笔记-NO.1
二叉树求和路径问题解答与注记









