Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7643|回复: 69

C++内存模型

  [复制链接]

该用户从未签到

8

主题

160

帖子

320

积分

普通会员

Rank: 2

积分
320
发表于 2023-3-10 23:09:01 | 显示全部楼层 |阅读模式
前言rgb一文中,我们已经介绍了C++11到C++17在并发编程方面的新增API。rgbrgbrgb6 P, b# v, T% H% R( |
    3 L$ b# W. @8 v( m. g6 }9 {( R4 J1 p
  • 可能会出现死锁并发的效率不够6 E: j2 u5 d2 ^" F7 M4 h/ m, x7 I7 l
rgbrgbrgbrgb关于C++内存模型rgbJSR-133。但C++直到2011标准才引入了内存模型。rgbrgbrgbrgbrgbrgb4 Q" \- a! P- q4 ?
    " K) r- s1 g7 y
  • 元子操作:顾名思义,这类操作一旦执行就不会被打断,你无法看到它的中间状态,它要么是执行完成,要么没有执行。4 S" K* d% N. I/ c: q8 T  t( R
  • 操作的局部顺序:一系列的操作不能被乱序。操作的可见性:定义了对于共享变量的操作如何对其他线程可见。3 h( H% ^( z; G. q
为什么需要内存模型?rgbrgbrgb
) Z* @3 ]; c8 Y% M& `

    & q: H! r% c7 u' ^# R7 n" @
  • 编译器优化2 {0 n$ c8 w6 S) O* \. a
  • CPU out-of-order执行CPU Cache不一致性) n& H/ F5 q$ @  z; n
rgbMemory Reorderrgbrgb 0, Y = 0;Thread 1: X = 1; // ①r1 = Y; // ②Thread 2: Y = 1;r2 = X;; v7 @# r8 N$ a

3 h+ `' w" p: |% `rgbrgbrgbrgbrgbrgb)。在这个基础上,它们可以做各种类型的优化。编译器优化rgbrgbrgb A, B;void foo(){    A = B + 1;    B = 0;}
$ j8 p# {& Y, P% F$ P. R. c
5 a  i0 t7 {* [" H: _' d3 [rgbrgb A, B;void foo(){    int temp = B;    B = 0;    A = temp + 1;}! @) H7 y& u0 `& I: `
8 l! ~. m  \5 q+ F! x' w6 @
rgbrgbrgb的工具给开发者,让开发者告诉编译器:这部分代码编译的时候不能乱序。rgbrgb A, B;void foo(){    A = B + 1;    asm volatile("" ::: "memory");    B = 0;}
# @0 _9 ^4 ^* ]5 D& g5 p
% m! M, C9 |' d; L4 D, X' M8 ~Out-of-order执行rgbrgbrgbrgbrgbrgbrgb一篇文章中给出的对比关系图。rgbrgbrgb* q$ _% |* Q, N9 v4 `6 w, \( W& |& r2 D

    2 V+ Q4 Z- d  Z* U3 G; D
  • Weak vs. Strong Memory Models
    ! T  C" n% j' r7 i( C
  • This Is Why They Call It a Weakly-Ordered CPU% A1 |+ Z$ E& }9 I; L
  • A Tutorial Introduction to the ARM and POWER Relaxed Memory Modelsx86-TSO: A Rigorous and Usable Programmer’s Model for x86 Multiprocessors8 m( g+ t: d4 Q$ b. p9 ^) b
rgbrgb), void _mm_lfence(void)sfence (asm), void _mm_sfence(void)mfence (asm), void _mm_mfence(void)
# z* u9 F3 S) @% o1 B9 a4 D6 U4 d2 j; \: J1 d& R8 m8 U& b
rgbCache Coherencyrgbrgbrgbrgbrgbrgbrgbrgb对象和内存位置rgbrgbrgbrgb
% `; U% r) P2 ^2 S

    ; |( _" g2 ^* b5 M% @
  • 标量类型(Scalar Type)的对象,标量类型包括下面几种:
    $ A( ]0 A" Q; y+ d+ }- l
      : B  t" ~5 f% b5 D8 a8 p/ i8 P
    • 数字类型:整数或者浮点数! u$ \( S/ k. J0 x
    • T *指针类型) E; _; y3 W( Q' V8 f6 c( r
    • 枚举类型/ k0 l% _5 c2 B) b
    • 指向成员的指针
      8 I9 e& ]# L& N
    • nullptr_t; ?: N& C$ e# r: v/ |8 o1 \2 y3 e
    相邻位域(Bit field)的最大序列
    * X: V% ]0 L, a$ r/ w
位域rgbrgbrgb S { // 三位的无符号位域, // 允许值为 0...7 unsigned int b : 3;};
* P9 n6 {7 l& w
4 b1 a5 N- y' H7 s- F0 Nrgbrgbrgb S {    char a;         // 内存位置 #1    int  b : 5;     // 内存位置 #2    int  c : 11,    // 内存位置 #2 (接续,相邻位域占用同一个内存位置)           : 0,     // 无名位域,分隔了下一个位域         d : 8;     // 内存位置 #3 (由于存在0值无名位域,这里是一个新的内存位置)    struct {        int ee : 8; // 内存位置 #4    } e;} obj;6 U. a5 B7 }% z7 z( ?" H4 ]2 w: O9 ^
3 [% @# L5 D0 v- [! P2 h+ H
rgbrgbrgbrgb修改顺序rgbrgbrgbrgbrgb
3 k- X) O, n" \# n& m+ \4 e
    # U- w/ [; y) i6 G9 b9 G$ i: k
  • 对于原子类型(见下文):由编译器保证数据的同步。对于非原子类型:由开发者保证。
    7 T. I* U, j/ v, N7 C
rgb一文中,就是通过互斥体来对非原子类型数据进行数据同步的。rgbrgbrgbrgb关系术语rgbsequenced-beforergbrgbrgbrgb i = 7; // ①i++;       // ②
5 R9 F5 r2 t( _! M: A( G, g2 j2 M, E! y: V' @! _7 m; a0 u
rgbrgbrgb i++ + i;
1 ~4 ~+ X' ?$ ^, d
1 Z2 O, \" P" \+ b% `4 h) [: ]rgbhappens-beforergbrgbrgbrgbsynchronizes-withrgbrgbrgbrgb原子类型与原子操作rgbrgbrgb
关于volatile和原子类型:Java和C++都有volatile关键字。但同样的关键字在不同的语言中有着不同的含义。Java中的volatile和C++的原子类型是类似的含义。而C++中的volatile是禁止编译器对这个变量进行优化。
! t& M: Q4 T; L, Q
  X# _; Z1 O; v4 X- Z) Y# H
资源下载地址和密码(百度云盘):
游客,如果您要查看本帖隐藏内容请回复
[/hide] 百度网盘信息回帖可见
+ C6 a" \( w6 h5 M; a; |' T- e4 e5 g; G" ?
+ `% M0 c) g5 D- P, A

# h7 n: O! h% ^* n9 e* H, @本资源由Java自学网收集整理【www.javazx.com】
回复

使用道具 举报

该用户从未签到

4

主题

148

帖子

294

积分

普通会员

Rank: 2

积分
294
发表于 2023-3-11 00:02:49 | 显示全部楼层
淡定,淡定,淡定……
回复 支持 反对

使用道具 举报

  • TA的每日心情
    郁闷
    2016-6-11 22:46
  • 签到天数: 1 天

    [LV.1]初学乍练

    0

    主题

    4096

    帖子

    8202

    积分

    普通会员

    Rank: 2

    积分
    8202
    发表于 2023-3-31 21:10:28 | 显示全部楼层
    楼猪V5啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4127

    帖子

    8255

    积分

    普通会员

    Rank: 2

    积分
    8255
    发表于 2023-4-23 07:45:25 | 显示全部楼层
    可以看看吗
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4132

    帖子

    8266

    积分

    普通会员

    Rank: 2

    积分
    8266
    发表于 2023-5-1 08:38:21 | 显示全部楼层
    看起来好像不错的样子
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4129

    帖子

    8260

    积分

    普通会员

    Rank: 2

    积分
    8260
    发表于 2023-5-25 23:24:50 | 显示全部楼层
    佩服佩服!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4072

    帖子

    8146

    积分

    普通会员

    Rank: 2

    积分
    8146
    发表于 2023-6-20 08:43:09 | 显示全部楼层
    学习了学习了学习了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-11-19 11:25
  • 签到天数: 1 天

    [LV.1]初学乍练

    0

    主题

    4074

    帖子

    8170

    积分

    普通会员

    Rank: 2

    积分
    8170
    发表于 2023-6-24 18:37:09 | 显示全部楼层
    学习编程好地方 加油
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4218

    帖子

    8438

    积分

    普通会员

    Rank: 2

    积分
    8438
    发表于 2023-6-27 15:28:33 | 显示全部楼层
    哈哈哈哈哈,开心
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4143

    帖子

    8288

    积分

    普通会员

    Rank: 2

    积分
    8288
    发表于 2023-7-18 18:42:27 | 显示全部楼层
    不错 支持一个了
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Java自学网

    GMT+8, 2024-11-21 20:43 , Processed in 0.210296 second(s), 25 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

    快速回复 返回顶部 返回列表