美文网首页
2018-11-11 #C++ 内存模型#

2018-11-11 #C++ 内存模型#

作者: 11bansakana | 来源:发表于2018-11-12 00:10 被阅读0次

C++ 原子操作内存模型

C++ 原子操作内存模型解决并发编程的什么问题?

相信在大多数应用程序员眼里,代码在编辑器里敲成什么顺序,CPU就按什么顺序执行。但是事实不是这个样子的。
CPU And 编译器会对最终的指令顺序做调整,在单线程纵向观察,你写出的1->2->3->4->5很有可能在最终结果不变(单线程环境)的基础上被优化成各种样子:e.g.:2->1->4->5->3。
但是,把上述的规则拿到多线程环境,就会出事了。
按理说,4执行完的时候,3应该执行完了,但是在优化的作用下4执行完了3可能还没动呢,那么另外一个线程以4影响的变量做条件,然后去读3影响的变量,就会出问题。
也就是,单线程里由于编译优化,乱序执行带来的指令不按序执行,放在多线程环境里的问题。

C++ 原子操作内存模型是什么

从上面的问题出发,引起这个问题的是CPU和编译器。解决的最简单方法就是告诉CPU:WYSIWYG,我怎么顺序写的,你怎么顺序执行,但是这样十分影响性能。有没有稍微松动一些的规约呢?
于是,“规约”成了这个问题的核心点,C++原子类型内存模型就是我们要的“规约”,它告诉程序员,编译器,CPU:只要你遵守这个条件,其余都随你优化。

有哪几种内存模型?

  • memory_order_relaxed 不对执行顺序做任何保证
  • memory_order_consume 本线程所有后续有关本操作的必须在本操作完成后执行
  • memory_order_acquire 本线程所有后续的读操作必须在本条操作完成才能执行
  • memory_order_release 本线程所有之前的写操作完成后才执行本操作
  • memory_order_acq_rel 同时包含acquire和release
  • memory_order_seq_cst 全部顺序执行
    参考这里提供的解释,说的比较明白

相关文章

  • 2018-11-11 #C++ 内存模型#

    C++ 原子操作内存模型 C++ 原子操作内存模型解决并发编程的什么问题? 相信在大多数应用程序员眼里,代码在编辑...

  • C++内存模型

    在讲述内存模型的时候,我们使用下面这段代码来涵盖各种内存分配的情况 这是内存变量图: rodata 和 text ...

  • C++内存模型

    普通成员函数存储方式 C++程序的内存格局通常分为四个区:全局数据区(data area),代码区(code ar...

  • C++内存模型

    内存模型是多线程环境能够可靠工作的基础,因为内存模型需要对多线程环境的运作细节进行完备的定义。 内存模型通过共享数...

  • C++_day06

    C++核心编程 主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓 1. 内存分区模型 C++程序...

  • 理解C++虚函数

    title: 理解C++虚函数date: 2018-11-11 15:31:26categories:- 概念理解...

  • NDK学习 之 Java对象映射C++对象

    背景 我们都知道Java内存模型和C++内存模型不同,而且是分开存储和管理的。做NDK开发的小伙伴经常遇到这样一个...

  • 开篇2:C/C++ 内存布局与程序栈

    如果你对C/C++基本数据类型的内存模型没概念的话,可以先查看该传送门《开篇1:C/C++ 内存中的数据表示》,反...

  • C++11 Memory Model

    Herb Sutter在一次对C++11内存模型的演讲中提到C++11的内存模型,让C++有了标准独立于编译器和平...

  • C++ 对象内存模型

    (很久之前写的了,先扔上来 继承 (无虚函数时) 单继承 类的对象的内存布局如下所示: 类中的成员变量的存储顺序从...

网友评论

      本文标题:2018-11-11 #C++ 内存模型#

      本文链接:https://www.haomeiwen.com/subject/pxhffqtx.html