Multithreading เป็นรูปแบบเฉพาะของการทำงานหลายอย่างพร้อมกัน และการทำงานหลายอย่างพร้อมกันเป็นคุณลักษณะที่ช่วยให้คอมพิวเตอร์ของคุณสามารถเรียกใช้โปรแกรมตั้งแต่สองโปรแกรมขึ้นไปพร้อมกันได้ โดยทั่วไป มัลติทาสก์มีอยู่ 2 ประเภท:แบบอิงตามกระบวนการและแบบอิงตามเธรด
มัลติทาสกิ้งแบบอิงตามกระบวนการจะจัดการการทำงานของโปรแกรมพร้อมกัน มัลติทาสกิ้งแบบอิงตามเธรดเกี่ยวข้องกับการประมวลผลชิ้นส่วนของโปรแกรมเดียวกันพร้อมกัน
โปรแกรมแบบมัลติเธรดประกอบด้วยสองส่วนขึ้นไปที่สามารถทำงานพร้อมกันได้ แต่ละส่วนของโปรแกรมดังกล่าวเรียกว่าเธรด และแต่ละเธรดจะกำหนดเส้นทางของการดำเนินการแยกจากกัน
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 ที่เธรดจะดำเนินการเมื่อถูกสร้างขึ้น |
| หาเรื่อง | อาร์กิวเมนต์เดียวที่อาจส่งผ่านไปยัง 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;
printf("Hello World! Thread ID, %d\n", tid);
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) {
printf("Error:unable to create thread, %d\n", rc);
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