学习笔记 -- Win32 多线程程序设计

本文介绍如何使用Windows API创建、管理和终止线程。包括CreateThread函数的详细参数说明及使用示例,展示了如何检测线程是否结束并通过GetExitCodeThread获取线程退出状态。此外还提供了强制退出线程的方法。

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

创建一个线程使用如下API
HANDLE WINAPI CreateThread(
  _In_opt_  LPSECURITY_ATTRIBUTES  lpThreadAttributes,
  _In_      SIZE_T                 dwStackSize,
  _In_      LPTHREAD_START_ROUTINE lpStartAddress,
  _In_opt_  LPVOID                 lpParameter,
  _In_      DWORD                  dwCreationFlags,
  _Out_opt_ LPDWORD                lpThreadId
);
具体参照MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682453(v=vs.85).aspx


为了安全防护, 不可能通过一个线程ID(lpThreadId)而获得线程句柄


最终调用完了,需要调用CloseHandle 释放句柄
BOOL WINAPI CloseHandle(
  _In_ HANDLE hObject
);
具体参照MSDN: https://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx


获取线程是否已经结束,可以调取下面的API 获知
BOOL WINAPI GetExitCodeThread(
  _In_  HANDLE  hThread,
  _Out_ LPDWORD lpExitCode
);
具体参照MSDN: https://msdn.microsoft.com/en-us/library/ms683190(VS.85).aspx


强制退出线程
VOID WINAPI ExitThread(
  _In_ DWORD dwExitCode
);

具体参照MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682659(v=vs.85).aspx


#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;


DWORD WINAPI ThreadFunc(LPVOID);

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE hThread1 = NULL;
	HANDLE hThread2 = NULL;
	DWORD dwThreadId1 = 0;
	DWORD dwThreadId2 = 0;
	DWORD dwExitCode1 = 0;
	DWORD dwExitCode2 = 0;

	hThread1 = CreateThread(0,0,ThreadFunc,(LPVOID)1,0,&dwThreadId1);
	if (hThread1)
	{
		cout<<"Thread1 started"<<endl;
	}

	hThread2 = CreateThread(0,0,ThreadFunc,(LPVOID)2,0,&dwThreadId2);
	if (hThread2)
	{
		cout<<"Thread2 started"<<endl;
	}

	for (;;)
	{
		cout<<"Press any key to exit"<<endl;
		getchar();

		GetExitCodeThread(hThread1,&dwExitCode1);
		GetExitCodeThread(hThread2,&dwExitCode2);

		if (dwExitCode1 == STILL_ACTIVE)
		{
			cout<<"Thread1 is working"<<endl;
		}
		if (dwExitCode2 == STILL_ACTIVE)
		{
			cout<<"Thread2 is working"<<endl;
		}
		if (dwExitCode1 != STILL_ACTIVE
			&& dwExitCode2 != STILL_ACTIVE)
		{
			cout<<"All threads finished"<<endl;
			break;
		}
	}

	if (hThread1)
	{
		CloseHandle(hThread1);
	}

	if (hThread2)
	{
		CloseHandle(hThread2);
	}

	cout<<"Thread1 exit with "<<dwExitCode1<<endl;
	cout<<"Thread2 exit with "<<dwExitCode2<<endl;

	system("PAUSE");

	return 0;
}

DWORD WINAPI ThreadFunc(LPVOID n)
{
	int j = (int)n;
	for (int i=0;i<10;i++)
	{
		Sleep(j*1000);
		cout<<j<<endl;

		if (j == 1 && i == 1)
		{
			ExitThread(4);
		}
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值