C/C++ 四种结束线程方式详解

一、四种方式

    1、线程自然return返回。

          如果线程能够返回,就可以确保下列事项的实现:
                 (1)在线程函数中创建的所有C++对象均将通过它们的析构函数正确地释放。
                 (2)操作系统将正确地释放线程堆栈使用的内存。
                 (3)系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。
                 (4)系统将递减线程内核对象的使用计数。

    2、调用 _endthreadex()函数或 ExitThread()函数。

    3、在同一个进程的另一个线程中调用 TerminateThread()函数。

    4、如果该线程位于某进程, 且该进程仅有这一个线程, 可直接结束进程以结束此线程。

     

二、安全性分析

        1、线程通过线程函数return返回而终止线程是最安全的, 当然我们设计也期望是这样结束线程。在线程函数return后会清理线程函数内申请的类对象, 即调用这些对象的析构函数(前提是栈上面的对象,手动new出来的对象依然需要自己去释放), 然后会自动调用 _endthreadex()函数来清理 _beginthreadex(…)函数申请的资源(主要是创建的tiddata对象)。

        2、如果使用_endthreadex()函数或 ExitThread()函数这两种方法退出线程, 则不会执行线程函数的return语句, 所以就不会调用线程函数作用域内申请的类对象的析构函数, 可能会造成内存泄露。

        3、同一进程中的另一线程调用TerminateThread()函数, 同样可能造成内存泄漏,而且由于该进程没有结束, 可能会多次创建结束线程, 造成严重的内存泄漏。

        4、通过结束进程去结束线程, 结果与上面类似。

三、总结

        并不是说所有线程都只能通过return返回, 只能说通过return结束线程,不会因为写程序的失误造成内存泄漏。如果在能确保释放内存的前提下, 也可以使用其他三种方式结束线程(谨慎使用)。

由于能力和经验限制,文章未能详尽和深入进行讲解。上述部分如有错误,欢迎指正和交流。

    

你可能感兴趣的:(C/C++)