Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

Windows thread API ในโปรแกรม C


เธรดถูกสร้างขึ้นใน Windows API โดยใช้ฟังก์ชัน CreateThread() และเช่นเดียวกับใน Pthreads ชุดของแอตทริบิวต์ เช่น ข้อมูลความปลอดภัย ขนาดของสแตก และแฟล็กสำหรับเธรดจะถูกส่งไปยังฟังก์ชันนี้ ในโปรแกรมด้านล่าง เราใช้ค่าเริ่มต้นสำหรับแอตทริบิวต์เหล่านี้ (ค่าเริ่มต้นไม่ได้ตั้งค่าเธรดเป็นสถานะถูกระงับในขั้นต้น และทำให้มีสิทธิ์เรียกใช้โดยตัวจัดกำหนดการ CPU) เมื่อสร้างเธรดการรวม พาเรนต์ต้องรอให้เสร็จสิ้นก่อนที่จะส่งออกค่าของ Sum เนื่องจากค่าถูกกำหนดโดยเธรดการรวม ในโปรแกรม Pthread เราให้เธรดหลักรอการรวมเธรดโดยใช้คำสั่ง pthread join() ที่นี่ โดยใช้ฟังก์ชัน WaitForSingleObject() เราดำเนินการเทียบเท่ากับสิ่งนี้ใน Windows API ซึ่งทำให้เธรดการสร้างบล็อกจนกระทั่ง เธรดผลรวมออกแล้ว ในสถานการณ์ที่ต้องรอให้หลายเธรดเสร็จสิ้น ฟังก์ชัน WaitForMultipleObjects() จะถูกใช้ ฟังก์ชันนี้ถูกส่งผ่านสี่พารามิเตอร์ -

  • จำนวนวัตถุที่รอ
  • ตัวชี้ไปยังอาร์เรย์ของวัตถุ
  • ธงที่ระบุว่ามีการส่งสัญญาณวัตถุทั้งหมดหรือไม่
  • ระยะเวลาหมดเวลา (หรือ INFINITE)

ตัวอย่างเช่น ถ้า THandles เป็นอาร์เรย์ของวัตถุขนาด N เธรดหลักสามารถรอให้เธรดย่อยทั้งหมดเสร็จสิ้นด้วยคำสั่งนี้ -

WaitForMultipleObjects(N, THandles, TRUE, INFINITE);

โปรแกรม C แบบมัลติเธรดโดยใช้ Windows API

ตัวอย่าง

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