关于线程由执行态变为挂起态的代码实现,,,

发布于 2015-02-02 19:50:04
线程由就绪态变为挂起态,不是先将进程PCB从就绪队列中删除,再插入阻塞队列吗?我有看到从就绪队列移除的函数代码,那么插入阻塞队列的代码在哪里呢?请看代码:
rt_err_t rt_thread_suspend(rt_thread_t thread)
{
register rt_base_t temp;

/* thread check */
RT_ASSERT(thread != RT_NULL);

RT_DEBUG_LOG(RT_DEBUG_THREAD, ("thread suspend: %s
", thread->name));

if (thread->stat != RT_THREAD_READY)
{
RT_DEBUG_LOG(RT_DEBUG_THREAD, ("thread suspend: thread disorder, %d
",
thread->stat));

return -RT_ERROR;
}

/* disable interrupt */
temp = rt_hw_interrupt_disable();

/* change thread stat */
thread->stat = RT_THREAD_SUSPEND;
rt_schedule_remove_thread(thread);

/* stop thread timer anyway */
rt_timer_stop(&(thread->thread_timer));

/* enable interrupt */
rt_hw_interrupt_enable(temp);

return RT_EOK;
}

查看更多

关注者
0
被浏览
1.8k
7 个回答
grissiom
grissiom 2015-02-02
阻塞没有队列。如果是阻塞在信号量上,则挂到信号量的队列里;如果要是阻塞在信号量上,则挂在信号量的队列上……
cumt11_lwz
cumt11_lwz 2015-02-02
阻塞没有队列。如果是阻塞在信号量上,则挂到信号量的队列里;如果要是阻塞在信号量上,则挂在信号量的队列上……

如果是掩饰引起的阻塞呢,那挂在哪里?
cumt11_lwz
cumt11_lwz 2015-02-03
是的延时~ 打错了。。
bernard
bernard 2015-02-03
这个时候不挂,而是在定时器超时时,由rt_thread_timeout(xx);把线程唤醒

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友