29win32编程基础——线程控制
suspendThred挂起线程
ResumeThread恢复线程
结束线程
1、ExitThread
2、线程函数返回,即线程正常结束,正常结束
3、线程强制结束
TerminateThread,告诉操作系统要结束线程
WaitForSingleObject
TerminateThread和ExitThread区别是:
1、TerminateThread是异步调用,用于强制终止线程;ExitThread是同步的,执行完后程序才能继续往下执行1。
TerminateThread调用后不能保证立即结束线程,在后面写线程结束后要执行的代码可能有问题,解决办法是用WaitForSingleObject.
ExitThread告诉操作系统,去把B线程结束,B线程结束后,然后A线程等待B线程结束,这个时候ExitThread返回
再执行后边代码。
TerminateThread告诉操作系统,去把C线程结束,告诉操作系统之后,继续执行A线程后边的代码,不管C线程结束不结束。
因此TerminateThread使用的时候,一般会考虑加个WaitForSingleObject,这个函数的意思就是,停在这里,等着操作系统告诉A线程,C线程已经结束了,WaitForSingleObject收到操作系统的这个通知,就继续执行后边的代码。
2、ExitThread结束线程会清理线程的堆栈空间,但是TerminateThread结束的时候不清理堆栈空间。
TerminateThread这种方式为什么不清理,因为C线程中的资源可能有别的线程在使用,如果你这个时候结束C线程的时候再清理C线程中的堆栈,那么可能会影响到别的线程的执行,因此微软这样设计,先不清理。
线程上下文CONTEXT
线程切换
线程挂起再恢复,
都要用到CONTEXT,这个结构体保存了执行的所有的寄存器,所以才能切换线程。
多线程与全局变量会出现访问问题,如何解决?