#include <stdio.h>
#include <windows.h>
DWORD Sum; /* data is shared by the thread(s) */
/* the thread runs in this separate function */
DWORD WINAPI Summation(PVOID Param)
{
DWORD Upper = *(DWORD *)Param;
for (DWORD i = 0; i <= Upper; i++)
Sum += i;
return 0;
}
int main(int argc, char *argv[])
{
DWORD ThreadId;
HANDLE ThreadHandle;
int Param;
// do some basic error checking
if (argc != 2) {
fprintf(stderr,"An integer parameter is required\n");
return -1;
}
Param = atoi(argv[1]);
if (Param < 0) {
fprintf(stderr, "an integer >= 0 is required \n");
return -1;
}
// create the thread
ThreadHandle = CreateThread(NULL, 0, Summation, &Param, 0, &ThreadId);
if (ThreadHandle != NULL) {
WaitForSingleObject(ThreadHandle, INFINITE);
CloseHandle(ThreadHandle);
printf("sum = %d\n",Sum);
}
}
- 必须包含windows.h头文件
- 在Pthread中,在单独线程中共享的数据sum,在这里被声明为全局变量(DWORD数据类型是一个无符号的32位整数)。
- 需要在单独线程中执行的Summation()函数,向该函数传递一个void指针,Windows将其定义为LPVOID,执行该函数的线程将全局数据sum从0设置为传递给 Summation()的参数
- Window使用CreateThread()来创建线程,就像Pthread一样,也需要传递一些列的属性,这些属性包含安全信息,栈大小,一个用以标识线程挂起状态是否开始的标识。
- 在Windows中使用WaitForSingleObject()来执行类似于Pthread中的fork-join。父线程会则色,直到计算(子)线程终止
- 在需要等待多个线程完成的情况下,可以使用WaitForMultipleObjects()函数,该函数需要四个参数:(1)要等待的对象的数量(2)指向对象数组的指针(3)指示是否所有对象结束的标志(4)超时(或者是INFINITE,即无超时时间的)。比如THandles是一个大小为N的线程HANDLE对象的数组,父进程可以像下面这样,等待这些子进程的终止:
WaitForMultipleObjects(N, THandles, TRUE, INFINITE);