宮城 发表于 2023-3-10 23:09:01

C++内存模型

前言rgb一文中,我们已经介绍了C++11到C++17在并发编程方面的新增API。rgbrgbrgb

[*]可能会出现死锁并发的效率不够
rgbrgbrgbrgb。关于C++内存模型rgb:JSR-133。但C++直到2011标准才引入了内存模型。rgbrgbrgbrgbrgbrgb

[*]元子操作:顾名思义,这类操作一旦执行就不会被打断,你无法看到它的中间状态,它要么是执行完成,要么没有执行。
[*]操作的局部顺序:一系列的操作不能被乱序。操作的可见性:定义了对于共享变量的操作如何对其他线程可见。
为什么需要内存模型?rgbrgbrgb

[*]编译器优化
[*]CPU out-of-order执行CPU Cache不一致性
rgbMemory Reorderrgbrgb 0, Y = 0;Thread 1: X = 1; // ①r1 = Y; // ②Thread 2: Y = 1;r2 = X;

rgb。rgbrgbrgbrgbrgb)。在这个基础上,它们可以做各种类型的优化。编译器优化rgb。rgbrgb A, B;void foo(){    A = B + 1;    B = 0;}

rgbrgb A, B;void foo(){    int temp = B;    B = 0;    A = temp + 1;}

rgbrgbrgb的工具给开发者,让开发者告诉编译器:这部分代码编译的时候不能乱序。rgbrgb A, B;void foo(){    A = B + 1;    asm volatile("" ::: "memory");    B = 0;}

Out-of-order执行rgbrgbrgbrgbrgbrgbrgb一篇文章中给出的对比关系图。rgbrgbrgb

[*]Weak vs. Strong Memory Models
[*]This Is Why They Call It a Weakly-Ordered CPU
[*]A Tutorial Introduction to the ARM and POWER Relaxed Memory Modelsx86-TSO: A Rigorous and Usable Programmer’s Model for x86 Multiprocessors
rgbrgb), void _mm_lfence(void)sfence (asm), void _mm_sfence(void)mfence (asm), void _mm_mfence(void)

rgbCache Coherencyrgbrgbrgbrgbrgbrgbrgbrgb对象和内存位置rgbrgbrgbrgb

[*]标量类型(Scalar Type)的对象,标量类型包括下面几种:

[*]数字类型:整数或者浮点数
[*]T *指针类型
[*]枚举类型
[*]指向成员的指针
[*]nullptr_t
相邻位域(Bit field)的最大序列
位域rgbrgbrgb S { // 三位的无符号位域, // 允许值为 0...7 unsigned int b : 3;};

rgbrgbrgb S {    char a;         // 内存位置 #1    intb : 5;   // 内存位置 #2    intc : 11,    // 内存位置 #2 (接续,相邻位域占用同一个内存位置)         : 0,   // 无名位域,分隔了下一个位域         d : 8;   // 内存位置 #3 (由于存在0值无名位域,这里是一个新的内存位置)    struct {      int ee : 8; // 内存位置 #4    } e;} obj;

rgbrgbrgbrgb修改顺序rgbrgbrgbrgbrgb

[*]对于原子类型(见下文):由编译器保证数据的同步。对于非原子类型:由开发者保证。
rgb一文中,就是通过互斥体来对非原子类型数据进行数据同步的。rgbrgbrgbrgb关系术语rgbsequenced-beforergbrgbrgbrgb i = 7; // ①i++;       // ②

rgbrgbrgb i++ + i;

rgbhappens-beforergbrgbrgbrgbsynchronizes-withrgbrgbrgbrgb原子类型与原子操作rgbrgbrgb关于volatile和原子类型:Java和C++都有volatile关键字。但同样的关键字在不同的语言中有着不同的含义。Java中的volatile和C++的原子类型是类似的含义。而C++中的volatile是禁止编译器对这个变量进行优化。

资源下载地址和密码(百度云盘):**** Hidden Message ***** 百度网盘信息回帖可见



本资源由Java自学网收集整理【www.javazx.com】

山地玫瑰 发表于 2023-3-11 00:02:49

淡定,淡定,淡定……

igeek 发表于 2023-3-31 21:10:28

楼猪V5啊

飘灵儿 发表于 2023-4-23 07:45:25

可以看看吗

rnlvr 发表于 2023-5-1 08:38:21

看起来好像不错的样子

zhoujianjian 发表于 2023-5-25 23:24:50

佩服佩服!

manpiaoyi 发表于 2023-6-20 08:43:09

学习了学习了学习了:)

yaowang 发表于 2023-6-24 18:37:09

学习编程好地方 加油

rainforwind 发表于 2023-6-27 15:28:33

哈哈哈哈哈,开心

jerry10301 发表于 2023-7-18 18:42:27

不错 支持一个了
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: C++内存模型