WindowsAPI 查阅笔记:线程、多个线程互同步

1. 线程的创建

HANDLE CreateThread(
	LPSECURITY_ATTRIBUTES 	lpThreadAttributes, //线程安全属性 
	SIZE_T					dwStackSize,		//线程堆栈大小 
	LPTHREAD_START_ROUTINE 	lpStartAddress,	//重要:  线程函数指针 
	LPVOID 					lpParameter,	//重要:  启动线程函数 
	DWORD 					dwCreationFlags,	//线程安全属性
	LPDWORD 				lpThreadId			//返回 TID 
);//返回新建线程的句柄 

1.1 线程函数

要符合接口参数要求

//ThreadProc 函数原型
DWORD WINAPI ThreadProc(
	LPVOID lpParameter
);

1.2 线程句柄与 TID

每一个线程都有一个句柄和一个标识符 (TID)。
TID 是 DWORD 类型,每个线程的 TID 都不同,所以可以用 TID 标识唯一的 线程。

  • 通过 TID 和 OpenThread() 可以获取线程的句柄。
  • 通过 句柄 和 GetThreadId()可以获取线程的TID。
  • GetCurrentThread() 获取本线程句柄。
  • GetCurrentThreadId() 获取本线程 TID。

1.3 创建线程代码

#include <windows.h>
#include <cstdio>

#define MAX_THREADS 5

typedef struct _THREAD_PARAM{
   
   
	DWORD i;
	DWORD dwRandom;
	DWORD dwData;
} THREAD_PARAM, *LPTHREAD_PARAM;

/****************
功能:线程函数,将参数打印出来 
****************/ 
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
   
   
	//参数数据类型 
	LPTHREAD_PARAM pData;
	pData = (LPTHREAD_PARAM)lpParam;
	
	printf("TID = %u,\tparameters = %u, %u, %u\n",
		GetCurrentThreadId(),
		pData->i,
		pData->dwRandom,
		pData->dwData);
	//释放保存参数的内存(主线程中分配的)
	HeapFree(GetProcessHeap(), 0, pData); 
	return 0;
}

/*********************
功能:创建多个线程 
******************/
int main(int argc, char **argv)
{
   
   
	LPTHREAD_PARAM pData;
	DWORD dwThreadId[MAX_THREADS];
	HANDLE hThread[MAX_THREADS];
	int i;
	//创建 MAX_THREADS 个线程 
	for(i = 0 ;i < MAX_THREADS; ++i){
   
   
		//为线程函数参数分配内存
		pData = (LPTHREAD_PARAM)HeapAlloc(GetProcessHeap(),
			HEAP_ZERO_MEMORY, sizeof(THREAD_PARAM));
			
		if(pData == NULL){
   
   
			printf("HeapAlloc error;\n");
			ExitProcess(2);
		} 
		//设置参数
		pData->i = i;
		pData->dwRandom = rand();
		pData->dwData = 100;
		//创建线程
		hThread[i] = CreateThread(
			NULL,		//默认安全属性
			0,			//默认堆栈大小
			ThreadProc,	//线程函数
			pData,		//参数
			0,			//默认创建标志
			&dwThreadId[i]);//返回TID 
			
		if(hThread[i] == NULL){
   
   
			printf("hThread[%d]创建失败!\n",i);
			ExitProcess(i);
		}
		Sleep(10);
	}
	
	//主线程等待其他子线程执行结束
	WaitForMultipleObjects(MAX_THREADS, hThread, TRUE, INFINITE);
	//关闭所有线程的句柄
	for(i = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值