A01-04 线程的停止和回收
线程停止:当return语句被执行时,表示线程正常退出。
int Routine()
{
printf("do something\n");
return 0; //线程的主函数退出
}
return语句被执行,Routune()返回,线程退出
异常退出:
①当主线程退出的时候,所以的子线程都会退出
②这种异常退出会造成数据的不完整,破坏数据。应尽量避免这种情况
③如果需要异常终止,应该先保存数据
如何让线程正常终止
①设置标识量(在类中添加bool m_quitflag变量,用来标识线程的状态)
②等待线程的退出:
MyTask task;
task.m_quitflag = false; //将状态设置为false
task.Run();
getchar(); //按下“回车”,退出
task.m_quitflag = true; //将状态设置为true
OS_thread::Join(&task); //等待目标线程退出
Join()函数作用:
①等待目标线程退出
②回收这个线程的相关资源(因为线程的个数是有限的)
③注意:线程是不能自己回收自己的,(在类中调用OS_Thread::Join(this)是不可行的)如下:
#include
#include
#include "osapi/Thread.h"
class MyTask1 :public OS_Thread
{
private:
virtual int Routine()
{
for (int i = 0; !m_quitflag && i < 10; i++)
{
printf("AAAAAA\n");
OS_Thread::Sleep(1); //使线程暂停1秒
}
printf("Task Exit...\n");
/*此处可以添加数据的处理*/
//OS_Thread::Join(this); //此处线程调用了自己(回收自己),这个显然是不可行的
return 0;
}
public:
bool m_quitflag; //标识量,控制线程的状态
};
int main()
{
MyTask1 a;
a.m_quitflag = false;
a.Run(); //a线程开始工作
getchar();
a.m_quitflag = true;
OS_Thread::Join(&a); //此处回收是可行的
system("pause");
return 0;
}
将m_quitflag封装进类中(防止破坏了封装性)如下:
#include
#include
#include "osapi/Thread.h"
class MyTask1 :public OS_Thread
{
private:
bool m_quitflag; //标识量,控制线程的状态
public:
int Start()
{
m_quitflag = false;
Run();
return 0;
}
int Stop()
{
m_quitflag = true;
Join(this); //为何此处可以使用呢?是否与前面的说法冲突?
/*
这只是一个c++的对象,而不是线程实体。要区分
*/
return 0;
}
private:
virtual int Routine()
{
for (int i = 0; !m_quitflag && i < 10; i++)
{
printf("AAAAAA\n");
OS_Thread::Sleep(1); //使线程暂停1秒
}
printf("Task Exit...\n");
/*此处可以添加数据的处理*/
return 0;
}
};
int main()
{
MyTask1 a;
a.Start();
getchar();
a.Stop();
system("pause");
return 0;
}
Join的调用位置:不能只看字面上的位置,而要从运行时的角度来看待问题