向往了多年,终于静下心来备战 IOCP,对于语言方面不缺少什么东西了,剩下的就是对操作系统和编程技巧的学习了,所以慢慢的开始写一些周边会涉及到的代码,也算是对 C/C++ 的复习,本文写的是一个 Windows 下多线程的例子,跟 Linux 下没什么区别,循环创建线程然后用堆上内存传递参数,代码有详细的注释可以参考。

参考学习地址:https://msdn.microsoft.com/zh-cn/office/ms682516(v=vs.71)

运行效果

2016-02-11_212502 你会发现创建的顺序并不是固定的,这就是多CPU情况下,多线程并行的一种效果,再深入以后,这也是多线程处理较麻烦的地方。

程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#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 = %d\n", 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;
}