volatile 与内存屏障
来源:互联网 发布:如何注册域名 虚拟主机 编辑:程序博客网 时间:2024/05/16 17:09
volatile
c语言中 volatile 关键字用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。volatile只能保证编译器不会做乱序执行优化.
1. 不对*p操作生成乱序指令(通常如此,具体请看后面的解释)
(比如条件判断)
2. 每次从*p取数据的时候,一定会进行一次访存操作,哪怕前面不久才取过*p的值放在寄存器里。
比如对于硬件寄存器的访问,内存中的数据和cache中的数据可能不一致.
3.不合并对*p的写操作(也只是通常如此,解释见后)
int *p;
volatile int *p1;
p = 1; //这个被优化
p = 2;
p1 = 1; //这个不会
p1 = 2;
但volatile无法保证 cpu运行时乱序执行.
内存屏障(memory barrier)
如果要想控制cpu运行是乱序执行优化则需有内存屏障.
#define isb() __asm__ __volatile__ ("isb" : : : "memory")
#define dsb() __asm__ __volatile__ ("dsb" : : : "memory")
#define dmb() __asm__ __volatile__ ("dmb" : : : "memory")
#define mb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)
#define rmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)
#define wmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0)
#define set_mb(var, value) do { var = value; mb(); } while (0)
1. set_mb(),mb(),barrier()函数追踪到底,就是__asm__ __volatile__("":::"memory"),而这行代码就是内存屏障。
2. __asm__用于指示编译器在此插入汇编语句
3. __volatile__ 相当于 C语言的volatile(见上面分析).
4. memory强制gcc编译器假设RAM所有内存单元均被汇编指令修改,这样cpu中的registers和cache中已缓存的内存单元中的数据 将作废。cpu将不得不在需要的时候重新读取内存中的数据。这就阻止了cpu又将registers,cache中的数据用于去优化指令,而避 免去访问内存。
5)"":::表示这是个空指令。barrier()不用在此插入一条串行化汇编指令。在后文将讨论什么叫串行化指令。
- volatile 与内存屏障
- volatile与内存屏障
- volatile与内存屏障
- JMM——volatile与内存屏障
- JMM——volatile与内存屏障
- 内存屏障--- asm volatile("" ::: "memory")
- volatile-内存屏障-互斥锁等-----非常好!
- 内存屏障与JVM并发
- 内存屏障: barrier()与mb()
- 内存屏障与JVM并发
- 内存屏障与JVM并发
- 内存屏障与JVM并发
- 内存屏障与JVM并发
- 内存屏障与JVM并发
- 内存屏障与JVM并发
- 内存屏障与JVM并发
- 内存屏障与JVM并发
- 内存屏障与JVM并发
- 导出EXCEL
- php-Arrays 函数-array_flip-交换数组中键和值
- Linux下分区详解之—Parted
- 怎么让程序员觉得没有压力
- JTable常见用法细则
- volatile 与内存屏障
- UIAPPLICATIONDELEGATE 代理函数调用的时间(应用程序生命周期)
- response.queryString的简单用法
- windows server 2003 远程桌面最大连接数调整
- 二维指针、指针数组和数组指针
- VC多线程例子
- SQL Server 2008 R2数据库镜像部署
- Evernote幕后高人田溯宁已为其进军中国铺平道路
- RichEdit删除行