线程的停止与回收

    xiaoxiao2021-03-25  121

    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的调用位置:不能只看字面上的位置,而要从运行时的角度来看待问题

    注:关于博客中的第三方库"osapi",可以通过访问http://www.afanihao.cn的共享代码模块中获

    详情请参见http://www.afanihao.cn/的应用篇

    转载请注明原文地址: https://ju.6miu.com/read-18571.html

    最新回复(0)