当前位置:网站首页>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的数据也没效果了。
边栏推荐
猜你喜欢
随机推荐
2022/08/02------丑数
谷歌浏览器安装插件教程步骤,开发用这2个插件工作效率倍增
MySQL 啥时候用表锁,啥时候用行锁?这些你都应该知道吧
warnings.warn(“Title is more than 31 characters. Some applications may not be able to read the file
使用range-based for循环的注意事项
MD5是对称加密还是非对称加密,有什么优缺点
Protobuf Grpc使用异常 类型有未导出的方法,并且是在不同的软件包中定义
云图说丨初识华为云微服务引擎CSE
WEB 渗透之SSRF
机器学习的方法总结
MD5是对称加密还是非对称加密,有什么优缺点
Oracle 脚本实现简单的审计功能
ROS仿真环境搭建
阿里巴巴政委体系-第六章、阿里政委体系运作
PHP基础笔记-NO.1
软件测试技术之如何编写测试用例(3)
Jenkins CI平台(二)
【汇编语言02】第2章 寄存器——理论知识
87.(cesium之家)cesium热力图(贴地形)
普通用户如何利用小红书赚钱呢?小红书的流量是真的吗?









