嵌入式技术william hill官网
直播中

其实znvm

8年用户 1163经验值
擅长:电源/新能源
私信 关注
[问答]

Rt-thread里面的mem.c函数保护lfree全局变量为什么用信号量

Rt-thread 里面的mem.c函数保护lfree全局变量为什么用信号量而不是互斥信号量,用信号量保护全局变量不怕造成线程优先级翻转吗

回帖(5)

张宇

2022-8-8 10:43:38
首先,为什么在申请和释放内存的过程中要用 IPC 来做互斥,而不是关中断,这是为了性能考虑。

这里使用信号量可能是因为信号量是系统中实现的第一个 IPC。

互斥量的实现目前在一些复杂情况下仍然有一些异常行为,会导致线程运行的时序可能并不如预想的那样,理论上来说,如果互斥量的实现很完美,那么这里使用互斥量来代替信号量应该是更好的选择。
举报

其实znvm

2022-8-8 10:43:47
互斥量的实现目前在一些复杂情况下仍然有一些异常行为,可以举个例子吗,我仿真一下。
我个人认为,信号量主要是用于线程间同步,保护全局变量用互斥信号量。当然,就算用信号量保护全局变量造成优先级翻转,一般很难通过设备运行状态发现
举报

张宇

2022-8-8 10:43:59
A(优先级20)已经获得互斥锁
此时 B(优先级 1) 尝试获取互斥锁
此时 C (优先级 10) 尝试获取互斥锁

此时 A 线程优先级被短暂提升为 1,继续运行,释放互斥锁后,优先级被降低为原优先级 20,但是由于线程 C 已经在尝试获取该锁,那么理论上其优先级应当降低为 10,而不是优先级 20。

还有第二种情况:

A(优先级20)已经获得互斥锁
此时 B(优先级 1) 尝试获取互斥锁

如果 B 因为超时退出,而 A 的优先级任然被短暂提高,造成 A 线程意外得到了运行。

这些地方是不完善的,有些情况是历史遗留问题,需要逐渐改进。
举报

其实znvm

2022-8-8 10:44:10
你说的第一种情况:A线程(优先级20),B线程(优先级1),C线程(优先级10),A线程先获取互斥信号量,B和C尝试获取该信号量失败,A线程当前优先级为1(继承B线程优先级)。当A释放掉互斥信号量后,此时互斥信号量被B线程占有,当B释放互斥信号量,互斥信号量被C线程占有.目前FreeRTOS和Rt-thread都是这样的实现的
举报

其实znvm

2022-8-8 10:44:31
你说的第一种情况,线程A释放掉互斥信号量之后就应该恢复到初始优先级
你说的第二种情况:FreeRtos里面的互斥信号量在B线程超时后会进行A线程优先级恢复操作,如果存在C线程之前尝试访问互斥信号量,则当B线程超时后,此时A线程将继承C线程的优先级,否则恢复A线程默认优先级。Rt-thread目前没有做超时处理,当B线程超时后会以B线程的优先级运行直到信号量释放。建议:RT-thread使用互斥信号量超时时间设置RT_WAITING_FOREVER,可以解决你说的第二个问题
举报

更多回帖

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