29win32編程基礎(chǔ)——線程控制
suspendThred掛起線程
ResumeThread恢復(fù)線程
結(jié)束線程
1、ExitThread
2、線程函數(shù)返回,即線程正常結(jié)束,正常結(jié)束
3、線程強制結(jié)束
TerminateThread,告訴操作系統(tǒng)要結(jié)束線程
WaitForSingleObject
TerminateThread和ExitThread區(qū)別是:
1、TerminateThread是異步調(diào)用,用于強制終止線程;ExitThread是同步的,執(zhí)行完后程序才能繼續(xù)往下執(zhí)行1。
TerminateThread調(diào)用后不能保證立即結(jié)束線程,在后面寫線程結(jié)束后要執(zhí)行的代碼可能有問題,解決辦法是用WaitForSingleObject.

ExitThread告訴操作系統(tǒng),去把B線程結(jié)束,B線程結(jié)束后,然后A線程等待B線程結(jié)束,這個時候ExitThread返回
再執(zhí)行后邊代碼。

TerminateThread告訴操作系統(tǒng),去把C線程結(jié)束,告訴操作系統(tǒng)之后,繼續(xù)執(zhí)行A線程后邊的代碼,不管C線程結(jié)束不結(jié)束。
因此TerminateThread使用的時候,一般會考慮加個WaitForSingleObject,這個函數(shù)的意思就是,停在這里,等著操作系統(tǒng)告訴A線程,C線程已經(jīng)結(jié)束了,WaitForSingleObject收到操作系統(tǒng)的這個通知,就繼續(xù)執(zhí)行后邊的代碼。
2、ExitThread結(jié)束線程會清理線程的堆棧空間,但是TerminateThread結(jié)束的時候不清理堆棧空間。
TerminateThread這種方式為什么不清理,因為C線程中的資源可能有別的線程在使用,如果你這個時候結(jié)束C線程的時候再清理C線程中的堆棧,那么可能會影響到別的線程的執(zhí)行,因此微軟這樣設(shè)計,先不清理。
線程上下文CONTEXT
線程切換
線程掛起再恢復(fù),
都要用到CONTEXT,這個結(jié)構(gòu)體保存了執(zhí)行的所有的寄存器,所以才能切換線程。
多線程與全局變量會出現(xiàn)訪問問題,如何解決?

浙公網(wǎng)安備 33010602011771號