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

มัลติเธรดใน C++


Multithreading เป็นรูปแบบเฉพาะของการทำงานหลายอย่างพร้อมกัน และการทำงานหลายอย่างพร้อมกันเป็นคุณลักษณะที่ช่วยให้คอมพิวเตอร์ของคุณสามารถเรียกใช้โปรแกรมตั้งแต่สองโปรแกรมขึ้นไปพร้อมกันได้ โดยทั่วไป มัลติทาสกิ้งมีสองประเภท:แบบอิงตามกระบวนการและแบบเธรด

มัลติทาสกิ้งแบบอิงตามกระบวนการจะจัดการการทำงานของโปรแกรมพร้อมกัน Threadbased multitasking เกี่ยวข้องกับการประมวลผลชิ้นส่วนของโปรแกรมเดียวกันพร้อมกัน

โปรแกรมแบบมัลติเธรดประกอบด้วยสองส่วนขึ้นไปที่สามารถทำงานพร้อมกันได้ แต่ละส่วนของโปรแกรมดังกล่าวเรียกว่าเธรด และแต่ละเธรดจะกำหนดเส้นทางของการดำเนินการที่แยกจากกัน

C ++ ไม่มีการสนับสนุนในตัวสำหรับแอปพลิเคชันแบบมัลติเธรด แทนที่จะใช้ระบบปฏิบัติการทั้งหมดในการจัดเตรียมคุณลักษณะนี้

บทช่วยสอนนี้อนุมานว่าคุณกำลังทำงานบน Linux OS และเราจะเขียนโปรแกรม C++ แบบมัลติเธรดโดยใช้ POSIX POSIX Threads หรือ Pthreads มี API ซึ่งมีอยู่ในระบบ POSIX ที่คล้ายกับ Unix เช่น FreeBSD, NetBSD,GNU/Linux, Mac OS X และ Solaris

รูทีนต่อไปนี้ใช้เพื่อสร้างเธรด POSIX -

#include <pthread.h>
pthread_create (thread, attr, start_routine, arg)

ที่นี่ pthread_create สร้างเธรดใหม่และทำให้สามารถเรียกใช้งานได้ รูทีนนี้สามารถเรียกได้หลายครั้งจากทุกที่ภายในโค้ดของคุณ นี่คือคำอธิบายของพารามิเตอร์

พารามิเตอร์ คำอธิบาย
เธรด ตัวระบุที่ไม่ซ้ำแบบทึบสำหรับเธรดใหม่ที่ส่งคืนโดยรูทีนย่อย
ความสนใจ วัตถุแอตทริบิวต์ทึบแสงที่อาจใช้ในการตั้งค่าแอตทริบิวต์ของเธรด คุณสามารถระบุออบเจ็กต์แอตทริบิวต์ของเธรดหรือ NULL สำหรับค่าเริ่มต้นได้
start_routine รูทีน C++ ที่เธรดจะดำเนินการเมื่อถูกสร้างขึ้น
arg อาร์กิวเมนต์เดียวที่อาจส่งผ่านไปยัง start_routine จะต้องผ่านการอ้างอิงเป็นตัวชี้ประเภทโมฆะ ค่า NULL สามารถใช้ได้หากไม่มีการส่งต่ออาร์กิวเมนต์

จำนวนเธรดสูงสุดที่อาจสร้างขึ้นโดยกระบวนการขึ้นอยู่กับการใช้งาน เมื่อสร้างแล้ว เธรดคือเพียร์ และอาจสร้างเธรดอื่น ไม่มีลำดับชั้นโดยนัยหรือการขึ้นต่อกันระหว่างเธรด

ปิดกระทู้

มีรูทีนต่อไปนี้ที่เราใช้เพื่อยุติเธรด POSIX –

#include <pthread.h>
pthread_exit (status)

ที่นี่ pthread_exit ใช้เพื่อออกจากเธรดอย่างชัดเจน โดยทั่วไป รูทีน pthread_exit() จะถูกเรียกหลังจากที่เธรดทำงานเสร็จแล้ว และไม่จำเป็นต้องมีอยู่อีกต่อไป

หาก main() เสร็จสิ้นก่อนที่จะสร้างเธรด และออกด้วย pthread_exit() เธรดอื่นจะดำเนินการต่อไป มิฉะนั้น จะถูกยกเลิกโดยอัตโนมัติเมื่อ main() เสร็จสิ้น

ตัวอย่าง

#include <iostream>
#include <cstdlib>
#include <pthread.h>
using namespace std;
#define NUM_THREADS 5
void *PrintHello(void *threadid) {
   long tid;
   tid = (long)threadid;
   cout << "Hello World! Thread ID, " << tid << endl;
   pthread_exit(NULL);
}
int main () {
   pthread_t threads[NUM_THREADS];
   int rc;
   int i;
   for( i = 0; i < NUM_THREADS; i++ ) {
      cout << "main() : creating thread, " << i << endl;
      rc = pthread_create(&threads[i], NULL, PrintHello, (void *)i);
      if (rc) {
         cout << "Error:unable to create thread," << rc << endl;
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

ผลลัพธ์

$gcc test.cpp -lpthread
$./a.out
main() : creating thread, 0
main() : creating thread, 1
main() : creating thread, 2
main() : creating thread, 3
main() : creating thread, 4
Hello World! Thread ID, 0
Hello World! Thread ID, 1
Hello World! Thread ID, 2
Hello World! Thread ID, 3
Hello World! Thread ID, 4