电子产业一站式赋能平台

PCB联盟网

搜索
查看: 82|回复: 0
收起左侧

嵌入式Linux:为什么需要线程同步?

[复制链接]

989

主题

989

帖子

8575

积分

高级会员

Rank: 5Rank: 5

积分
8575
发表于 2025-2-21 08:03:00 | 显示全部楼层 |阅读模式

1inumcubo2p6405520.gif

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

    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

    izuqceemewi6405720.jpg

    + H. E1 _0 |9 j# E! K# U9 M

    fnpp1w2q5ir6405820.gif

    fnpp1w2q5ir6405820.gif
    9 N* p2 X" n, t
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表