在C程序中的Windows线程API

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

在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

"); 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); } }

以上就是在C程序中的Windows线程API的详细内容,更多请关注php中文网其它相关文章!

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