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,这个结构体保存了执行的所有的寄存器,所以才能切换线程。

多线程与全局变量会出现访问问题,如何解决?

posted @ 2023-10-30 17:32  一日学一日功  阅读(47)  评论(0编辑  收藏  举报