mutex 优先级翻转 bug

发表在 Kernel2020-3-26 20:10 [复制链接] 8 81

1.  假设 thread A 的优先级为 10,获取到两个互斥锁 mux1 和 mux2。     则 mux1->origin_priority = 10,mux1->owner = A。' f1 e! X4 `' o) U) W& R
          mux2->origin_priority = 10,mux2->owner = A。/ [* y9 F, O1 P

7 U; ~. r& ~/ C+ B# S; ?2.  假设 thread B 的优先级为 7,来获取 mux1,则 B 被挂起在 mux1 的等待队列中,且 thread A 的优先级被提升为 7。/ Z. `- C  |0 h& C+ y3 c! M( D
3.  假设 thread C 的优先级为 5,来获取 mux2,则 C 被挂起在 mux2 的等待队列中,且 thread A 的优先级被进一步提升到 5。
, G$ \0 W* k7 P' p' d# J& Z% i# F" ]
4.  假设 thread A 释放 mux2,则 thread A 的优先级被还原为 10,且 mux2 给 thread C 使用。1 a! g0 Q- }" Y/ p6 s7 L
     这时 thread A 的优先级变为 10,还拥有互斥锁 mux1,而 thread B 还被挂在 mux1 的等待队列中,但 thread B 的优先级是 7,比 thread A 高,重新出现了优先级翻转的现象。6 p, ~' J  H4 X+ t
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2020-3-27 01:33:11 | 显示全部楼层
……
( H) ^" Z: j# e) m3 i% \互斥量持有者被别的优先级高的线程再次获取时才会提升,优先级10怎么提升到7的?
3 g9 k- q- X9 [6 u' @6 b没看懂
使用道具 举报 回复
发表于 2020-3-27 01:43:53 | 显示全部楼层
这还是1个线程使用2个互斥量的情况,要是3个等多个互斥量呢?这个咋搞
使用道具 举报 回复
发表于 2020-3-27 10:31:23 | 显示全部楼层
本帖最后由 yangjie 于 2020-3-27 10:41 编辑 ; B! B4 S7 t6 O' V4 \: @
" Q$ O0 o9 T! x, Q$ \" j" i
你的意思是threadA此时没有变成threadB的优先级吗?# [/ T) [% v! f% a
使用道具 举报 回复
发表于 2020-3-27 13:05:23 | 显示全部楼层
yhb1206 发表于 2020-3-27 01:43
2 d9 n9 `1 \% d这还是1个线程使用2个互斥量的情况,要是3个等多个互斥量呢?这个咋搞
' C+ |; x" ?8 {; ?& u4 h
所以   代码的实现上  有  bug  。
使用道具 举报 回复
发表于 2020-3-27 13:07:48 | 显示全部楼层
yhb1206 发表于 2020-3-27 01:33$ r. u8 E. m4 g) f. g: q
……
+ J0 w  H% Y) `5 V, c- j互斥量持有者被别的优先级高的线程再次获取时才会提升,优先级10怎么提升到7的?/ E  C8 f, B! Y  i2 @( H
没看懂 ...
- t' e4 [# I9 @( m# Q
thread B 获取  mux1 ,mux1这时的  owner  是  thread A, 这会 使得 thread A 的优先级被提升到  与  thread B  一样高,thread B 会被挂到  mux1 的 等待队列中去等待 mux1 的释放。
使用道具 举报 回复
发表于 2020-3-27 13:09:10 | 显示全部楼层
yangjie 发表于 2020-3-27 10:31  }& \2 U- s5 ?( j% N  ]" _5 Y' t
你的意思是threadA此时没有变成threadB的优先级吗?
" R/ j+ o$ f% m9 u! ~$ y
是的   所以又重新出现了优先级翻转的现象
使用道具 举报 回复
发表于 2020-3-27 13:52:37 | 显示全部楼层
本帖最后由 yangjie 于 2020-3-27 13:54 编辑
! p' f* _3 J  f0 g6 L
狐狸老了 发表于 2020-3-27 13:09
- K$ ?+ @1 a1 X& t8 q是的   所以又重新出现了优先级翻转的现象
3 x) ^. f. U7 S& j! O! [- N- Z, [
这相当于你把第二个互斥量嵌套在第一个互斥量的使用之中了,这样的用法有点别扭; Z! ^0 V5 E. A+ w! f$ w
take(mux1)4 v; T6 ~2 O0 g2 V, c& ?  n
take(mux2)/ e- H$ B- J+ M' B
release(mux1): i' Z* Q! P9 a  x, v9 J
release(mux2)
; K5 s! `! R/ `8 X" |take(mux1). c( N1 c9 F, c$ x
take(mux2)
1 s! i2 W# i) Z$ j' B$ q( ~8 A+ Trelease(mux2)
! @) N% H! k5 _  X, c$ R3 zrelease(mux1)
: M) ^9 g0 {* ~  j
3 a  U/ q7 q1 e9 D在实际使用中则需要考虑:互斥量作为保护临界区的时候需要成对使用且尽快释放。/ Q$ k/ k# r- _: Y1 h* K: V* z; Z/ M
take(mux1)
! g' V. E3 Q+ N* e5 c# Orelease(mux1). @; j& Y" Y, W! L/ B! z
take(mux2)
1 u4 h. u* L  J0 h/ p# s/ T* c: q0 irelease(mux2)% R. a8 a( X5 o/ r
并且同一线程对互斥量可多次持有。
- x6 |- `; y4 T# p1 X+ Dtake(mux1)+ W" ?; z+ G- P3 m: O
take(mux1)$ k8 U( n) w, K& ?4 B6 m
release(mux1)
8 z2 B; @% g! |9 ^  D+ {8 d4 trelease(mux1), ?/ _$ x+ U4 B; Y7 M8 @# ]
使用道具 举报 回复
发表于 2020-3-27 19:21:59 | 显示全部楼层
yangjie 发表于 2020-3-27 13:52
" l0 o; s  N1 i( c+ h" c这相当于你把第二个互斥量嵌套在第一个互斥量的使用之中了,这样的用法有点别扭1 y- W9 m8 ]( `2 C$ n3 u
take(mux1)
; i$ [1 @7 {7 J' ~; s& D4 U& utake(mux2)
7 L) H, _- V0 k) r) C% L# a/ w
别扭  并不代表不会有人这么用   
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  1. 1 主题
  2. 21 帖子
  3. 21 积分

Ta的主页 发消息

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

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