aCoral操作系统中,采用了和Linux一样的方式退出线程,线程函数不用死等货显示调用退出相关函数,也就是说用户不用担心函数执行完后的事情,因为aCoral操作系统帮你做了线程退出相关函数,当线程代码执行完后,系统会隐式调用acoral_thread_exit()函数进行线程退出相关的处理。
void acoral_thread_exit(){
acoral_kill_thread(acoral_cur_thread);
}
void acoral_kill_thread(acoral_thread_t *thread){
acoral_evt_t *evt;
acoral_enter_critical();
/* */
/* */
if(thread->state&ACORAL_THREAD_STATE_SUSPEND){//如果线程处于挂起状态,则需要从相关列表中取下来
evt=thread->evt;
/**/
if(thread->state&ACORAL_THREAD_STATE_DELAY){ //延时挂起,则从延时队列上取下来
acoral_list_del(&thread->waiting);
}else
{
/**/
if(evt!=NULL){ //如果是事件等待,则从事件队列取下。
acoral_evt_queue_del(thread);
}
}
}
acoral_unrdy_thread(thread); //从就绪队列上取下来
acoral_release_thread1(thread); //释放线程
acoral_exit_critical();
acoral_sched();
}
void acoral_release_thread1(acoral_thread_t *thread){//SPG这个和acoral_release_thread有什么区别
acoral_list_t *head;
acoral_thread_t *daem;
thread->state=ACORAL_THREAD_STATE_EXIT;
head=&acoral_res_release_queue;
acoral_list_add2_tail(&thread->waiting,head); //将线程挂到回收队列,供daemon线程回收资源
daem=(acoral_thread_t *)acoral_get_res_by_id(daemon_id);
acoral_rdy_thread(daem); //唤醒daemon线程回收资源
}
将线程设置为退出状态,如果是当前线程,只能是EXIT状态,表明还不能释放该线程的资源,如TCB、堆栈,因为线程尽管要退出了,但是还没完成退出的使命,还需要继续向前走,直到走到线程切换函数HAL_SWITCH_TO函数。
线程即使挂到回收队列,但如果状态不是RELEASE,也是不能回收的