使用该CreateThread()函数在Windows API中创建线程,并且就像在Pthread中一样,将一组属性(如安全性信息,堆栈的大小以及该线程的标志)传递给此函数。在下面的程序中,我们为这些属性使用默认值。(默认值最初不会将线程设置为挂起状态,而是使其有资格由CPU调度程序运行。)创建求和线程后,父级必须等待它完成才能输出Sum值,因为该值是由求和线程设置的。在Pthread程序中,我们使用pthreadjoin()语句让父线程等待求和线程。WaitForSingleObject()函数,我们在Windows API中执行与之等效的操作,这将导致创建线程阻塞,直到求和线程退出。在需要等待多个线程完成的情况下,将WaitForMultipleObjects()使用该功能。此函数传递四个参数-
等待的对象数
指向对象数组的指针
一个标志,指示是否已发出所有对象信号。
超时时间(或INFINITE)
例如,如果THandles是大小为N的线程HANDLE对象的数组,则父线程可以等待该语句完成其所有子线程-
WaitForMultipleObjects(N,THandles,TRUE,INFINITE);
#include<windows.h>
#include<stdio.h>
DWORD Sum;
/* data is shared by the thread(s) */
/* thread runs in this separate function */
DWORD WINAPI Summation(LPVOID 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;
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, /* default security attributes */ 0, /* default stack size */
Summation, /* thread function */ &Param, /* parameter to thread function */ 0, /* default creation flags */ &ThreadId);
/* returns the thread identifier */
if (ThreadHandle != NULL){
/* now wait for the thread to finish */ WaitForSingleObject(ThreadHandle,INFINITE);
/* close the thread handle */
CloseHandle(ThreadHandle);
printf("sum = %d\n",Sum);
}
}