嵌入式技术论坛
直播中

石玉兰

7年用户 1451经验值
私信 关注
[问答]

thread_resume导致的信号量异常怎么处理?

最近同事调试网络通信时发现一个bug, 描述如下
  • 1. 有线程a, b, c
  • 2. b和c竞争一个信号量,信号量初始值为1
  • 3. c获取信号量,b被挂起,此时信号量值为0
  • 4. a使用rt_thread_resume将b唤醒,b被移出suspend列表
  • 5. 然后c释放信号量,此时由于suspend列表中的b已经被移除,信号量的值变为1
  • 6. 然后b继续执行,用完之后再次释放信号量,信号量的值变为2
至此,信号量初值由1变为了2,这显然是有问题的
最后描述一下实际场景,网络编程中用select进行阻塞io,实现过程中会把线程加入等待队列然后挂起,而挂起之前出现了信号量竞争不过,书包来了之后通过等待队列把线程唤醒,导致了问题。
存在多种手段对线程进行挂起/恢复,这里可能会有冲突,是否需要加以区分?

回帖(1)

剑寒九州

2022-4-29 09:39:23
楼主问题整理得很清楚
举报

更多回帖

发帖
×
20
完善资料,
赚取积分