|
前言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++内存模型rgb:JSR-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: |% `rgb。rgbrgbrgbrgbrgb)。在这个基础上,它们可以做各种类型的优化。编译器优化rgb。rgbrgb 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】 |
|