最近同事调试网络
通信时发现一个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,实现过程中会把线程加入等待队列然后挂起,而挂起之前出现了信号量竞争不过,书包来了之后通过等待队列把线程唤醒,导致了问题。
存在多种手段对线程进行挂起/恢复,这里可能会有冲突,是否需要加以区分?