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 =