windows下创建多线程:
一个简单的例子
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
|
#include <windows.h> //需要含该头文件 #include <iostream> //winodws下多线程函数原型必需如下声明 //DWORD unsigned long //WINAPI _stdcall //函数名可以用任何合法名称替换 //LPVOID void * DWORD
WINAPI ThreadProc( LPVOID
lpParamter);
int
main()
{ //多线程例子
//win线程创建函数
HANDLE
hThrdPrc = CreateThread(NULL, //安全性 NULL为默认
0, //初始栈的大小, 设为0或小于默认提交大小, 就会使用同调用函数的线程相同的栈空间大小.
ThreadProc, //线程地址
NULL, //线程接受的参数
0, //附加标记, CREATE_SUSPENDED: 创建线程后要手动调用ResumeThread启动线程, 0为自动启动
NULL /*一个结构体, 用来接收线程ID, 可为NULL*/ );
CloseHandle(hThrdPrc); //关闭句柄, 线程已启动, 表示对这个线程句柄没兴趣作别的事情
std::cout<< "this is in main!\n" ;
std::cin.get();
return
0;
} DWORD
WINAPI ThreadProc( LPVOID
lpParamter)
{ std::cout<< "Thread in ThreadProc not in main\n" ;
return
0;
} |
这是一个带有返回值, 和传递多个参数的例子:
思路是把所有需要的参数和返回值封装到一个结构中:
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
|
#include <windows.h> #include <iostream> DWORD
WINAPI ThreadProc( LPVOID
lpParamter);
typedef
struct
{ //将多个参数和返回值放到结构中
int
a;
int
b;
int
sum;
bool
isOk; //判断线程是否完成
} Addtor, * PTRADD; int
main()
{ Addtor adder;
adder.a = 10;
adder.b = 20;
adder.isOk = false ;
HANDLE
hThrdPrc = CreateThread(NULL,
0,
ThreadProc,
( LPVOID )(&adder), //将结构体指针传递给线程
0,
NULL);
CloseHandle(hThrdPrc);
while (!adder.isOk) {} //等待线程结果
std::cout<< "Sum = " <<adder.sum<<std::endl;
std::cout<< "done in main!\n" ;
std::cin.get();
return
0;
} DWORD
WINAPI ThreadProc( LPVOID
lpParamter)
{ PTRADD pa = (PTRADD)lpParamter;
pa->sum = pa->a + pa->b;
pa->isOk = true ;
return
0;
} |