Computer >> Máy Tính >  >> Lập trình >> lập trình C

API luồng Windows trong chương trình C

Các luồng được tạo trong Windows API bằng cách sử dụng hàm CreateThread () và — cũng giống như trong Pthreads — một tập hợp các thuộc tính như thông tin bảo mật, kích thước của ngăn xếp và cờ cho luồng được chuyển tới hàm này. Trong chương trình dưới đây, chúng tôi sử dụng các giá trị mặc định cho các thuộc tính này. (Các giá trị mặc định ban đầu không đặt luồng thành trạng thái tạm ngừng và thay vào đó làm cho nó đủ điều kiện để chạy bởi bộ lập lịch CPU.) Khi luồng tổng kết được tạo, cha mẹ phải đợi nó hoàn thành trước khi xuất giá trị của Sum, vì giá trị được đặt bởi chuỗi tổng kết. Trong chương trình Pthread, chúng tôi đã để chuỗi mẹ đợi chuỗi tổng kết bằng cách sử dụng câu lệnh pthread join () Ở đây, bằng cách sử dụng hàm WaitForSingleObject (), chúng tôi thực hiện tương tự như vậy trong Windows API, khiến chuỗi tạo bị chặn cho đến khi chủ đề tổng kết đã thoát. Trong các tình huống yêu cầu đợi nhiều luồng hoàn thành, hàm WaitForMultipleObjects () được sử dụng. Hàm này được truyền bốn tham số -

  • Số lượng đối tượng cần chờ
  • Một con trỏ tới mảng đối tượng
  • Một cờ cho biết tất cả các đối tượng đã được báo hiệu hay chưa.
  • Khoảng thời gian chờ (hoặc INFINITE)

Ví dụ:nếu THandles là một mảng các đối tượng HANDLE của luồng có kích thước N, thì luồng mẹ có thể đợi tất cả các luồng con của nó hoàn thành với câu lệnh này -

WaitForMultipleObjects (N, THandles, TRUE, INFINITE);

Chương trình C đa luồng sử dụng Windows API.

Ví dụ

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