Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9180|回复: 83

C++内存模型

  [复制链接]

该用户从未签到

9

主题

167

帖子

335

积分

普通会员

Rank: 2

积分
335
发表于 2023-3-10 23:09:01 | 显示全部楼层 |阅读模式
前言rgb一文中,我们已经介绍了C++11到C++17在并发编程方面的新增API。rgbrgbrgb
5 r+ I3 }6 v& l& T
    4 \( E' H# e: z' J/ c# K
  • 可能会出现死锁并发的效率不够6 L4 h! ~3 ^/ M* Z+ _3 G
rgbrgbrgbrgb关于C++内存模型rgbJSR-133。但C++直到2011标准才引入了内存模型。rgbrgbrgbrgbrgbrgb% n! S$ {5 S$ V# K& i  u
    & d! d& x( M5 b9 ?1 e& S
  • 元子操作:顾名思义,这类操作一旦执行就不会被打断,你无法看到它的中间状态,它要么是执行完成,要么没有执行。
    % B+ q6 g: O/ k8 O2 d8 p
  • 操作的局部顺序:一系列的操作不能被乱序。操作的可见性:定义了对于共享变量的操作如何对其他线程可见。
    9 w2 R% j7 m+ D" ~
为什么需要内存模型?rgbrgbrgb
; }5 p4 |( ]5 r7 @$ d7 `. O

    7 t4 T. D4 N  B
  • 编译器优化& K* H" Y1 J# [2 f
  • CPU out-of-order执行CPU Cache不一致性" q: P6 H+ b( ^+ _
rgbMemory Reorderrgbrgb 0, Y = 0;Thread 1: X = 1; // ①r1 = Y; // ②Thread 2: Y = 1;r2 = X;
; L, M4 Q8 {2 {0 H  u* E8 I+ c
1 U, g& h; N  }$ ]$ \' \2 E2 Wrgbrgbrgbrgbrgbrgb)。在这个基础上,它们可以做各种类型的优化。编译器优化rgbrgbrgb A, B;void foo(){    A = B + 1;    B = 0;}
/ X2 f" l# o- I/ I2 W/ v, i
7 D6 e/ r! e( ^, C0 irgbrgb A, B;void foo(){    int temp = B;    B = 0;    A = temp + 1;}
: a* m3 P/ T2 h; I: y
$ y' `# c1 ^$ y0 y: ergbrgbrgb的工具给开发者,让开发者告诉编译器:这部分代码编译的时候不能乱序。rgbrgb A, B;void foo(){    A = B + 1;    asm volatile("" ::: "memory");    B = 0;}
0 s, x3 Z( Y  s1 {! L& g. y+ w/ F" d' I  Z1 h) s& C
Out-of-order执行rgbrgbrgbrgbrgbrgbrgb一篇文章中给出的对比关系图。rgbrgbrgb
" X8 m. `$ \' I& {9 e
    ' l, R3 w! S' g* S- f
  • Weak vs. Strong Memory Models$ k) k, y3 }9 k; L& u
  • This Is Why They Call It a Weakly-Ordered CPU
    + z, x+ e$ t8 _8 \, U
  • A Tutorial Introduction to the ARM and POWER Relaxed Memory Modelsx86-TSO: A Rigorous and Usable Programmer’s Model for x86 Multiprocessors
    ! `$ ?2 u  n" x8 h- `
rgbrgb), void _mm_lfence(void)sfence (asm), void _mm_sfence(void)mfence (asm), void _mm_mfence(void)
3 q! H8 L  M, A
  a) b1 W$ Z/ b7 @4 B) R6 DrgbCache Coherencyrgbrgbrgbrgbrgbrgbrgbrgb对象和内存位置rgbrgbrgbrgb
+ O- n* u' _) d- t

    2 L0 f+ V; I+ L4 Z8 |* Y
  • 标量类型(Scalar Type)的对象,标量类型包括下面几种:
    $ [5 `2 |% {/ s6 F& A0 C' J( r

      ! X8 C* Y8 t( r
    • 数字类型:整数或者浮点数) A" s) s/ b* o/ i
    • T *指针类型" M' |1 W% m# t# [$ v5 Q
    • 枚举类型
      4 u# n4 t& a! N3 [* z8 `
    • 指向成员的指针
      : p5 y0 h1 d* A) ^8 o8 \" w" C8 D* w
    • nullptr_t2 o$ d% z7 x3 [
    相邻位域(Bit field)的最大序列
    - T9 c- M( f" m; }
位域rgbrgbrgb S { // 三位的无符号位域, // 允许值为 0...7 unsigned int b : 3;};
6 |7 }9 f' s+ N' q0 g8 x. Q0 ^
8 M* t( ]' M1 J9 G7 n; q" [) prgbrgbrgb S {    char a;         // 内存位置 #1    int  b : 5;     // 内存位置 #2    int  c : 11,    // 内存位置 #2 (接续,相邻位域占用同一个内存位置)           : 0,     // 无名位域,分隔了下一个位域         d : 8;     // 内存位置 #3 (由于存在0值无名位域,这里是一个新的内存位置)    struct {        int ee : 8; // 内存位置 #4    } e;} obj;+ q. Y1 k- t: C5 b3 k% G$ @
- ^. X* O( h" X/ b
rgbrgbrgbrgb修改顺序rgbrgbrgbrgbrgb
9 w. U6 e4 h& x( y/ m. J
    * r, M0 T. {9 y+ X
  • 对于原子类型(见下文):由编译器保证数据的同步。对于非原子类型:由开发者保证。' _- _0 F+ ?0 N+ b
rgb一文中,就是通过互斥体来对非原子类型数据进行数据同步的。rgbrgbrgbrgb关系术语rgbsequenced-beforergbrgbrgbrgb i = 7; // ①i++;       // ②6 d; ]' [/ U$ v* g' I; ~6 c$ K
0 z" d! e& k) z6 P5 M
rgbrgbrgb i++ + i;1 D9 ^/ V! ]. d/ ]9 S0 C( Y" Z

& f1 r  }/ T0 v' X" O5 ^4 Zrgbhappens-beforergbrgbrgbrgbsynchronizes-withrgbrgbrgbrgb原子类型与原子操作rgbrgbrgb
关于volatile和原子类型:Java和C++都有volatile关键字。但同样的关键字在不同的语言中有着不同的含义。Java中的volatile和C++的原子类型是类似的含义。而C++中的volatile是禁止编译器对这个变量进行优化。

1 E% m* B: J0 R
. l' ^7 ~# u; ?. [4 z$ S* @( J资源下载地址和密码(百度云盘):
游客,如果您要查看本帖隐藏内容请回复
[/hide] 百度网盘信息回帖可见0 I+ D2 I' L8 Y9 u6 |

: o/ a* d& [) b* N, M. k, c8 r% o( ]: j$ P- J! z8 s5 |5 }. s, G
' }, K7 m' ^$ B6 E* p
本资源由Java自学网收集整理【www.javazx.com】
回复

使用道具 举报

该用户从未签到

4

主题

156

帖子

294

积分

普通会员

Rank: 2

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

使用道具 举报

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

    [LV.1]初学乍练

    0

    主题

    4443

    帖子

    8896

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

    该用户从未签到

    0

    主题

    4456

    帖子

    8913

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

    该用户从未签到

    0

    主题

    4514

    帖子

    9030

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

    该用户从未签到

    0

    主题

    4526

    帖子

    9054

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

    该用户从未签到

    0

    主题

    4443

    帖子

    8888

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

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

    [LV.1]初学乍练

    0

    主题

    4414

    帖子

    8850

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

    该用户从未签到

    0

    主题

    4577

    帖子

    9156

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

    该用户从未签到

    0

    主题

    4451

    帖子

    8904

    积分

    普通会员

    Rank: 2

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-23 11:42 , Processed in 0.107299 second(s), 29 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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