windows结束线程的三种方式

本文介绍了Windows平台上结束线程的三种方法:线程函数自然返回、调用ExitThread以及使用TerminateThread。推荐的方式是让线程函数执行到return,这种方式安全且系统会清理堆栈。而TerminateThread是异步且不安全的,可能导致资源未被释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

windows 结束线程有三种方式

一、让线程函数执行到 return

二、在线程函数内调用 ExitThread

三、调用 TerminateThread

其中前两种方式比较类似,它们都是通过修改某个变量来达到改变子线程执行流程,从而实现退出的目的。这两种方式是同步的,安全的,线程退出后会系统会清理堆栈。

第三种方式 TerminateThread 是异步的,它会创建一个新的线程去结束我们希望干掉的线程,该函数立即返回,是异步的。如果程序希望线程真的结束,然后再往下走,那么就需要在 TerminateThread 后面调用 WaitForSingleObject 函数,阻塞等待线程真的结束。

如果希望子线程安全地退出,并执行释放资源代码,使用方式一;
如果希望子线程直接退出,没有需要释放的资源,可以使用方式二;
第三种方式结束线程不安全,系统不会清理子线程的堆栈,不推荐使用。

这是我写的一个测试程序:
在这里插入图片描述

下面附上三种结束方式的实现

方式一(推荐)

// ThreadOperatorGUI.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

BOOL flag = TRUE; // 控制子线程结束

DWORD WINAPI MyThread(LPVOID lpParam)
{
   
	HWND hEdit = (HWND)lpParam;
	TCHAR szBuffer[10];
	GetWindowText(hEdit, szBuffer, 10);	
	for (int i = 0; i <= 10000; i++)
	{
   
		if (!flag) break;
		_stprintf(szBuffer, TEXT("%d"), i);
		SetWindowText(hEdit, szBuffer);		
		Sleep(200);
	}
	return 0;
}

BOOL CALLBACK MainDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   
	static HWND hEdit;
	static HANDLE hThread;

	switch(uMsg)
	{
   
	case WM_CLOSE:
		{
   
			EndDialog(hDlg, 0);
			return TRUE;
		}
	case WM_INITDIALOG:
		{
   
			hEdit = GetDlgItem(hDlg, IDC_EDIT);
			SetWindowText(hEdit, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值