为什么rt_thread_suspend函数通常不应用来挂起当前线程本身呢?在等待信号量或者消息对列的消息时,都会挂起当前线程,按理说应该是个很普遍的使用情况,为什么RT在设计这个函数的时候,不考虑支持挂起当前线程自身呢?求大神解惑…IMG_20211222_143951.jpg
suspend 不推荐使用,因为 suspend 本质上容易出现死锁。
假如A线程使用锁,并且使用 suspend 挂起,B线程需要这把锁才能执行 resume 恢复A线程,就导致了死锁。
我也是在强烈建议支持上这个功能,所有的OS都有这个功能,不管是不是RTOS都有,唯独rtt不提供。我认为这个rtt的一个功能缺陷。
zephyr nuttx freertos ucos都提供 就是rtt这个地方不提供。
rt-thread-suspend目前是只支持挂起自己,不支持挂起其他线程 https://github.com/RT-Thread/rt-thread/issues/3912#issuecomment-706582417
更新,这个挂起函数rtt处理是对的,挂起很容易导致饥饿
支持啊。我看定时器的线程rtt源码就有用呢 rt-thread/src/timer.c
/* system timer thread entry */
static void rt_thread_timer_entry(void *parameter)
{
rt_tick_t next_timeout;
while (1)
{
/* get the next timeout tick */
next_timeout = rt_timer_list_next_timeout(rt_soft_timer_list);
if (next_timeout == RT_TICK_MAX)
{
/* no software timer exist, suspend self. */
rt_thread_suspend(rt_thread_self());
rt_schedule();
}
else
{
rt_tick_t current_tick;
/* get current tick */
current_tick = rt_tick_get();
if ((next_timeout - current_tick) < RT_TICK_MAX / 2)
{
/* get the delta timeout tick */
next_timeout = next_timeout - current_tick;
rt_thread_delay(next_timeout);
}
}
/* check software timer */
rt_soft_timer_check();
}
}
@changzehai 比如一个线程正在占用一个mutex,然后你把它挂起了,其他等待使用mutex的线程就会被饿死了。因为这个线程什么时候会被恢复是不一定的。
我看了基本上所有的rtos系统都提供了挂起和恢复接口,按理说,应该是很常用的两个接口呢
这个不是说不能用,而是用的时候可能会导致死锁现象,所以就建议不用,这样就能最大限度的避免这个问题。
@lzj 这个是用户使用不当的问题,信号量使用不当也可以造成死锁,指针使用不当也可以造成内存泄露。难道都取消掉?
@mysterywolf 是的,我理解的是官方不推荐使用,但是是可以用的,因为源码有些地方就是这么使用的。