|

1inumcubo2p6405520.gif
9 L7 H' ~: z o& d# o* O2 M0 s点击上方蓝色字体,关注我们
9 k# Q0 B% x0 x
5 q8 T" X ]# Z. c( x共享资源指的是多个线程可能会同时读取或修改的变量或数据结构。
& {+ g7 y4 s; r; ?* }' |7 M) W
, Z0 z. _& T' u d: t$ v! n: m7 r举个例子,如果有一个全局变量 a,线程1和线程2都在对这个变量进行读写操作,a 就成为了它们之间的共享资源,多个线程都需要访问它。
, s3 {! Q/ m0 |5 i# O
0 ^7 T, b% [, h$ [+ c {数据不一致的根本原因在于多个线程对共享资源的并发访问。
+ | U5 ^3 ~7 l5 e2 R. U2 h3 A+ v0 S- o' f; r; G
线程在操作系统中是并发执行的,它们可以在任意时间被操作系统调度。
+ P M3 b* t/ T9 q
2 }# Z8 n' c1 G- X, V因此,多个线程可能同时对某个共享资源进行操作,而这种并发操作就会导致竞争关系的产生。
" Q! l0 c2 n" `; A6 [. Y( M* Q; p6 a- Z+ t1 O
就像现实生活中的竞争一样,多个线程“争夺”对共享资源的控制权。
6 {- S6 ?+ h* P. ]7 T$ A8 S& ]# X- |' a. n' W8 Q( E6 V3 [
如果一个线程正在修改某个共享变量,另一个线程同时读取该变量,它可能会读取到一个错误或者不完整的值。- [4 i% z |' j$ T
18 f( t9 t* V8 o5 ^$ I" F
什么时候需要线程同步?* F* c9 H1 s4 ~- _% V4 d/ j
并非所有情况下都需要线程同步,只有在以下几种情况时才需要:# L6 R6 B( _! V Q" |
多个线程会修改共享资源:如果一个线程修改某个共享变量,其他线程可能也会修改或读取该变量,这时数据一致性问题就可能发生。比如线程1修改了变量 a 的值,但线程2在修改未完成前读取了 a,结果就会导致线程2获取到一个不正确的值。共享资源的写操作是非原子的:很多时候,修改共享资源的操作不是一个瞬时的、不可中断的过程,而是需要多个步骤完成的(如读-改-写的操作)。如果在这些步骤之间有其他线程介入,对同一个共享资源进行操作,就会产生不一致的结果。8 }2 u, L2 _" Q* C5 H7 J) D
2( j% \% \7 [* p5 i+ r
什么时候不需要线程同步?
- {; [( `' d& I7 n' e9 k2 t: S如果变量是局部变量(只在某个线程的作用域内),或全局变量但只有一个线程访问它,那么不需要担心数据一致性问题。如果变量是只读的,多个线程同时读取不会造成问题,因为它们不修改数据。! F- ^; i: p0 V( T
& O5 M: I( G4 _+ q, j# H0 A# C3 d; A假设有两个线程A和B,它们都在访问同一个共享变量x。1 G& u6 Y$ u1 s: l1 n- t! k+ s$ u
+ U- x2 g: D( m
线程A先读取变量x的值,然后准备将新的值写回x。
7 m. f" n+ y% @3 ?
" k3 {7 f; Z* \( u4 L& V5 Z! x假设写操作需要两个时钟周期完成,但在写操作还没完成的过程中,线程B恰好读取了变量x,此时线程B会得到一个旧的值,而不是预期的正确值。. j- E/ c- ?5 {) J6 i& I* O
( H/ e1 E3 E: n2 N6 `) G) o这种情况下,就会导致数据不一致。+ _' i- E/ S. b7 `
. v1 O2 I9 @) t! |* B w4 Z& K
k30ymlevtir6405620.png
& y: y! w* `: N1 ?$ s# r% g; Z3 N
/ Q) P- C3 K E' N$ A- V为了避免这种情况,我们引入线程同步机制。
5 f/ D- ]5 J0 m# f. y( f9 E; h
' L' |1 h1 f3 T6 I* h* g同步可以通过互斥锁(Mutex)、信号量(Semaphore)等方式来实现,确保同一时刻只有一个线程能够修改共享资源,防止数据在并发访问时出现异常。
. W% k4 R+ R/ c' ^. O9 G- i9 a
8 k4 V, P( o2 K, T, i这些机制可以有效解决资源的竞争问题,确保每个线程在访问共享资源时,都能够获得一致的状态。
2 z. h: t6 S: R% N; q; v
izuqceemewi6405720.jpg
+ H. E1 _0 |9 j# E! K# U9 M
fnpp1w2q5ir6405820.gif
9 N* p2 X" n, t
点击阅读原文,更精彩~ |
|