首页  >  文章  >  后端开发  >  在C程序中的Windows线程API

在C程序中的Windows线程API

PHPz
PHPz转载
2023-09-05 19:17:10569浏览

在C程序中的Windows线程API

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

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

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

以上是在C程序中的Windows线程API的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:tutorialspoint.com。如有侵权,请联系admin@php.cn删除