代码例子

性能测试代码

#include <benchmark/benchmark.h>
int A, B;void func1() {A = B + 1;asm volatile("pause" ::: "memory");B = 0;
}void func2() {A = B + 1;B = 0;
}void BM_MemoryBarrier(benchmark::State& state) {for (auto _ : state) {func1();}
}void BM_NoMemoryBarrier(benchmark::State& state) {for (auto _ : state) {func2();}
}int main(int argc, char** argv) {::benchmark::Initialize(&argc, argv);if (::benchmark::ReportUnrecognizedArguments(argc, argv)) return 1;::benchmark::RegisterBenchmark("BM_DemoSleep0", &BM_MemoryBarrier)->Iterations(10000);::benchmark::RegisterBenchmark("BM_DemoSleep1", &BM_NoMemoryBarrier)->Iterations(10000);::benchmark::RunSpecifiedBenchmarks();::benchmark::Shutdown();return 0;
}

结果:

分析

在松散型的内存模型,编译器可以在满足程序单线程执行结果情况下进行reorder,我们看下上面两个函数(func1、func2)的汇编代码:

// 代码void func2() {A = B + 1;B = 0;}
// 汇编代码
movl    B(%rip), %eax
movl    $0, B(%rip)
addl    $1, %eax
movl    %eax, A(%rip)
// 代码
void func1() {A = B + 1;asm volatile("pause" ::: "memory");B = 0;
}
// 汇编代码
movl    B(%rip), %eax
addl    $1, %eax
movl    %eax, A(%rip)
#APP
# 4 "main.cpp" 1pause
# 0 "" 2
#NO_APP
movl    $0, B(%rip)

可以看到正常情况下编译器会将B=0的指令重排,放到将B移至eax寄存器的指令后面,通过使用google benchmark测试也可以看到,编译器优化后的代码比不优化的快几十倍;

总结

在relaxed的内存模型下,编译器可能会将一些指令进行重排(为了效率,提升确实很明显),但这也为多线程同步带来了一些复杂度;

松弛型内存模型(Relaxed memory models)的一个有趣的例子相关推荐

  1. Java内存模型(Java Memory Molde,JMM)

    文章目录 1.Java内存模型(Java Memory Molde,JMM) 2. 多线程先行发生原则之happens-before 1.Java内存模型(Java Memory Molde,JMM) ...

  2. Java内存模型(Java Memory Model,JMM)

    导读 本文通过对JSR133规范的解读,详细的介绍JMM的核心理论,并将开发中常用的关键字的实现原来做了详细的介绍.通过本文读者可以了解到并发的一些基本理论,并对一些同步原语有了更深层次的理解.希望读 ...

  3. C语言layout文件有用吗,C语言内存模型 (C memory layout)

    一. 内存模型 1. .text 代码区(code section).由编译器链接器生成的可执行指令,程序执行时由加载器(loader)从可执行文件拷贝到内存中.为了安全考虑,防止别的区域更改代码区数 ...

  4. Java 内存模型(Java Memory Model,JMM)

    为了屏蔽各种硬件和操作系统的内存访问差异,JVM制定了一套JMM内存模型来实现同一套Java程序在不同平台上实现一样的运行效果.也就是一次编译到处运行跨平台的效果. JVM内存分配概念 JVM两个重要 ...

  5. 稀疏内存模型sparsemem memory model | 文章

    文章推荐 <sparsemem memory model>https://lwn.net/Articles/134804/ <Physical Memory Model>htt ...

  6. 内存模型-Memory Model

    文章目录 1.1 CPU Cache 的产生背景 1.2 CPU Cache 模型 1.3 什么是 Cache Line 1.4 Flase Sharing 问题 1.5 CPU 缓存一致性协议 1. ...

  7. 浅谈内存屏障,C++内存序与内存模型

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权. 文章目录 引言 一个有意思的问题 ...

  8. 《JAVA并发编程的艺术》之Java内存模型

    <JAVA并发编程的艺术>之Java内存模型 文章目录 <JAVA并发编程的艺术>之Java内存模型 Java内存模型的基础 并发编程模型的两个关键问题 Java内存模型的抽象 ...

  9. 高并发编程-重新认识Java内存模型(JMM)

    文章目录 从CPU到内存模型 内存模型如何确保缓存一致性 并发变成需要解决的问题 (原子性.可见性.有序性) 内存模型需要解决的问题 Java内存模型 JMM的API实现 原子性 synchroniz ...

  10. modeler java堆空间,JVM|02内存模型

    JVM内存模型 概述 Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保 ...

最新文章

  1. 计算机培训学校办学宗旨,西安软件科技培训学院简介
  2. border-raduis 在IE8中的兼容性问题
  3. 支付宝支付 第十一集:支付回调成功后的监听
  4. HTML结构化CSS网页布局入门指南
  5. SpringMVC-获得Restful风格的参数
  6. java命令行参数工具_Java方法中的参数太多,第8部分:工具
  7. apache shiro_Apache Shiro第2部分–领域,数据库和PGP证书
  8. Python笔记-requests获取web数据及下载文件
  9. 【重难点】【分布式 01】RESTful、RPC 对比、Dubbo、Spring Cloud 对比、Eureka、Zookeeper、Consul、Nacos 对比、分布式锁
  10. 强化学习 / 动态规划:策略改进(Policy Improvement)使策略更优的数学证明
  11. PowerShell中实现一个最基本的日志器logger
  12. SVN教程代码比较(图文教程)
  13. 初中计算机授课教案模板,初中课程教案模板
  14. 微博十年,再次走到十字路口
  15. linux otl mysql_Linux下用OTL操作MySql(包含自己封装的类库及演示样例代码下载)...
  16. linux 查看mac地址 的方法
  17. 电脑-U盘插入电脑(笔记本电脑)没反应
  18. 极限学习机 Extreme Learning Machines 介绍
  19. centos7查看ip命令
  20. mac安装powerdesigner

热门文章

  1. html自定义属性jquery怎么拿到,jquery 获取自定义属性(attr和prop)的实现代码
  2. Java TreeMap排序
  3. 用iTunes制作苹果手机铃声
  4. 微信号码检测是什么意思
  5. 计算机排线知识,宏利工程师为您讲解笔记本电脑触摸板软排线FFC的知识点[宏利]...
  6. 简单易懂的ROC曲线和AUC面积
  7. 文件或内容损坏无法读取 导致无法删除
  8. 超详细解析:Python输出水仙花数
  9. 简单整理一下以英文字母命名或者开头的语言
  10. windows7 旗舰版 集成 usb3.0 NVMe 支持 AM4