向往了多年,终于静下心来备战 IOCP,对于语言方面不缺少什么东西了,剩下的就是对操作系统和编程技巧的学习了,所以慢慢的开始写一些周边会涉及到的代码,也算是对 C/C 的复习,本文写的是一个 Windows 下多线程的例子,跟 Linux 下没什么区别,循环创建线程然后用堆上内存传递参数,代码有详细的注释可以参考。
参考学习地址:https://msdn.microsoft.com/zh-cn/office/ms682516(v=vs.71)
运行效果
你会发现创建的顺序并不是固定的,这就是多CPU情况下,多线程并行的一种效果,再深入以后,这也是多线程处理较麻烦的地方。
程序代码
代码语言:javascript复制#include <stdio.h>
#include <Windows.h>
#define MAX_THREADS 5
// 给线程传参的结构体
typedef struct MyData
{
int val1;
int val2;
} MYDATA, *PMYDATA;
DWORD WINAPI _WorkerThread(
_In_ LPVOID lpParameter
)
{
// 将参数解析为 PMYDATA 类型
PMYDATA MyData = (PMYDATA)lpParameter;
// 打印参数内容
printf("Thread %d is running...,val2 = %dn", MyData->val1, MyData->val2);
return 0;
}
int main(int argc, char* argv[])
{
HANDLE hThreadArray[MAX_THREADS]; // 创建线程后返回的句柄
PMYDATA pDataArray[MAX_THREADS]; // 给线程传递的参数数组
DWORD dwThreadIdArray[MAX_THREADS]; // 储存线程唯一标识符(ThreadId)
for (size_t i = 0; i < MAX_THREADS; i )
{
// 初始化线程参数,在堆上分配内存,用来给线程传参
pDataArray[i] = (PMYDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(MYDATA));
if (NULL == pDataArray[i])
{
printf("Alloc memory failed.");
ExitProcess(2);
}
pDataArray[i]->val1 = i;
pDataArray[i]->val2 = i 100;
// 创建线程
hThreadArray[i] = CreateThread(
NULL,
0,
_WorkerThread,
pDataArray[i],
0,
&dwThreadIdArray[i]);
// 判断线程是否创建成功
if (NULL == hThreadArray[i])
{
printf("Create Thread Error!");
ExitProcess(3);
}
}
// 等待所有线程结束
WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);
// 释放资源
for (size_t i = 0; i < MAX_THREADS; i )
{
CloseHandle(hThreadArray[i]);
if (NULL != pDataArray[i])
{
HeapFree(GetProcessHeap(), 0, pDataArray[i]);
pDataArray[i] = NULL;
}
}
return 0;
}