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

Multithreading ในภาษา C


Multithreading เป็นรูปแบบเฉพาะของ multitasking ซึ่งเป็นคุณสมบัติที่ทำให้คอมพิวเตอร์รันโปรแกรมได้พร้อมกันสองโปรแกรมขึ้นไป โดยทั่วไปมี 2 ประเภท: process-based และ thread-based

Process-based multitasking จัดการการทำงานพร้อมกันของโปรแกรม Thread-based multitasking จัดการการทำงานพร้อมกันของส่วนต่างๆ ในโปรแกรมเดียวกัน

โปรแกรม multithreaded ประกอบด้วย 2 ส่วนขึ้นไปที่รันพร้อมกัน แต่ละส่วนเรียกว่า thread แต่ละ thread กำหนด path of execution แยกกัน

C ไม่มีการสนับสนุน multithreading แบบ built-in แต่พึ่งพา operating system ให้บริการนี้ บทช่วยสอนนี้สมมติว่าทำงานบน Linux OS และจะเขียนโปรแกรม C หลายเธรดด้วย POSIX (Pthreads) ซึ่งให้ API บนระบบ Unix-like หลายๆ ระบบ

ฟังก์ชันสำหรับสร้าง POSIX thread:

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

pthread_create สร้างเธรดใหม่และทำให้ executable สามารถเรียกได้หลายครั้งจากที่ไหนก็ได้ในโค้ด พารามิเตอร์:

ParameterDescription
threadตัวระบุเธรดใหม่ที่ unique คืนโดย subroutine
attrออบเจ็กต์แอตทริบิวต์สำหรับตั้งค่าเธรด สามารถระบุ NULL สำหรับค่าเริ่มต้น
start_routineฟังก์ชัน C ที่เธรดจะ execute เมื่อสร้างแล้ว
argอาร์กิวเมนต์เดียวส่งให้ start_routine ต้องส่งผ่าน pointer cast เป็น void NULL หากไม่ต้องส่งอาร์กิวเมนต์

จำนวนเธรดสูงสุดที่ process สร้างได้ขึ้นกับ implementation เธรดที่สร้างแล้วเป็น peers สามารถสร้างเธรดอื่นได้ ไม่มีลำดับชั้นหรือ dependency

การยุติเธรด

ใช้ routine นี้เพื่อยุติ POSIX thread:

#include <pthread.h> pthread_exit (status)

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