x线程-启动与销毁

当一个线程启动时,会做什么操作:
1.创建内核对象
2.使用计数
3.ExitCode
4.Signaled
5.Context 线程上下文-----存储了CPU的当前状态---IP(指令寄存器)\SP(栈寄存器)
6.线程去进程当中申请一块内存,作为当前线程的栈
6.线程将lParam、lpStarAddress(线程的入口函数(RtUserThreadStart))存入栈中

Createthread()

_beginthreadex()--_endthread() 推荐使用此函数

注意:
_endthread 会自动关闭线程句柄。 (该行为与 Win32 ExitThread API 不同。)因此,当你使用 _beginthread 和 _endthread 时,请不要通过调用 Win32 CloseHandle API 来显式关闭线程句柄。

与 Win32 ExitThread API 相同,_endthreadex 不会关闭线程句柄。 因此,当你使用 _beginthreadex 和 _endthreadex 时,必须通过调用 Win32 CloseHandle API 来关闭线程句柄。

_endthread 和 _endthreadex 会导致 C++ 析构函数在不会调用的线程中处于挂起状态

两者的区别:
beginthreadex是一个C运行时库的函数,CreateThread是一个系统API函 数,_beginthreadex内部调用了CreateThread。为什么要有两个呢?因为C 运行库里面有一些函数使用了全局量,如果使用CreateThread 的情况下使用这些C 运行库的函数,就会出现不安全的问题。而 _beginthreadex 为这些全局变量做了处理,使得每个线程都有一份独立的“全局”量。


当一个进程销毁时,会做什么操作:
1.销毁临时对象
2.释放堆栈
3.将返回值设置为我的退出代码
4.减少进程内核对象的使用计数。

同理,当一个线程销毁时,会做什么操作:
1.销毁临时对象,调用析构函数
2.释放线程里面所分配的堆栈 -》窗口对象 HOOK(线程级别),其他都是进程级别
3.将返回值设置为我的退出代码,线程的入口函数的返回值设置为我的退出代码
4.减少线程内核对象的使用计数。

ExitThread() 立即结束当前线程
直接退出线程,同时会将当前线程的栈销毁,但不会调用析构函数。结果造成内存泄漏。
比如:在构造函数中new内存,但没调用析构函数,即该内存没有释放。

TerminateThread() 可以结束其他线程


配套使用方法:
第一种:
Createthread()
ExitThread()
CloseHandle()
第二种:
_beginthreadex()
_endthread()
第三种:
_beginthreadex()
_endthreadex()
CloseHandle()

 

posted @ 2017-06-27 23:49  gd_沐辰  阅读(872)  评论(0)    收藏  举报