C程序中的Windows线程API


线程是在Windows API中使用CreateThread()函数创建的,并且——就像在Pthreads中一样——一组属性(如安全信息、堆栈大小和线程标志)被传递给此函数。在下面的程序中,我们使用这些属性的默认值。(默认值最初不会将线程设置为挂起状态,而是使其有资格由CPU调度程序运行。)创建求和线程后,父线程必须等待它完成才能输出Sum的值,因为该值是由求和线程设置的。在Pthread程序中,我们让父线程使用pthread join()语句等待求和线程。在这里,使用WaitForSingleObject()函数,我们在Windows API中执行等效的操作,这会导致创建线程阻塞,直到求和线程退出。在需要等待多个线程完成的情况下,使用WaitForMultipleObjects()函数。此函数传递四个参数:

  • 要等待的对象数量
  • 指向对象数组的指针
  • 一个标志,指示是否所有对象都已发出信号。
  • 超时持续时间(或INFINITE)

例如,如果THandles是大小为N的线程HANDLE对象数组,则父线程可以使用此语句等待其所有子线程完成:

WaitForMultipleObjects(N, THandles, TRUE, INFINITE);

使用Windows API的多线程C程序。

示例

#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
");       return -1;    }    Param = atoi(argv[1]);    if (Param < 0){       fprintf(stderr,"An integer >= 0 is required
");       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
",Sum);    } }

更新时间: 2019年10月16日

2K+ 浏览量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告