线程退出学习

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,也是不能回收的

你可能感兴趣的:(嵌入式实时操作系统的设计与开发,学习,嵌入式实时操作系统)