PDA

צפייה בגרסה מלאה : מדריך תכנות מקבילי (Multithreading) בשפת C



Tamir
06-09-2024, 11:21 PM
תכנות מקבילי (Multithreading) בשפת C


תכנות מקבילי (Multithreading) מאפשר לתוכנית לבצע מספר משימות במקביל, מה שיכול לשפר את ביצועי התוכנית ולהגיב בצורה טובה יותר לאירועים שונים. בשפת C, ניתן לעבוד עם חוטים (Threads) באמצעות ספריית `pthread` (POSIX threads), שהיא אחת מהספריות הפופולריות ביותר לתכנות מקבילי.


התקנת ספריית pthread


במרבית הפצות לינוקס, ספריית `pthread` מותקנת כברירת מחדל. אם היא לא מותקנת, ניתן להתקינה באמצעות ניהול החבילות של המערכת שלך. אם אתה עובד על Windows, ייתכן שתצטרך להוריד ספריות תואמות או להשתמש בפתרונות כמו `WinPthreads`.


יצירת חוטים (Threads)


הפונקציה `pthread_create` משמשת ליצירת חוט חדש:



c
#include <stdio.h>
#include <pthread.h>


// פונקציה שתבוצע על ידי החוט החדש
void* thread_function(void* arg) {
printf("Hello from the thread!\n");
return NULL;
}


int main() {
pthread_t thread;


// יצירת חוט חדש
if (pthread_create(&thread, NULL, thread_function, NULL) != 0) {
printf("Failed to create thread\n");
return 1;
}


// המתנה להשלמת החוט
pthread_join(thread, NULL);


return 0;
}



שימוש בנתונים משותפים (Shared Data)


כאשר מספר חוטים גורסים את אותם נתונים, חשוב להשתמש ב-mechanisms כמו mutexes (סוגרנים) כדי להימנע מהפרות של הנתונים:



c
#include <stdio.h>
#include <pthread.h>


int shared_data = 0;
pthread_mutex_t mutex;


void* thread_function(void* arg) {
pthread_mutex_lock(&mutex);


// קריאה וכתיבה לנתונים משותפים
shared_data++;
printf("Shared data: %d\n", shared_data);


pthread_mutex_unlock(&mutex);
return NULL;
}


int main() {
pthread_t threads[5];
pthread_mutex_init(&mutex, NULL);


// יצירת חוטים
for (int i = 0; i < 5; i++) {
if (pthread_create(&threads[i], NULL, thread_function, NULL) != 0) {
printf("Failed to create thread\n");
return 1;
}
}


// המתנה להשלמת כל החוטים
for (int i = 0; i < 5; i++) {
pthread_join(threads[i], NULL);
}


pthread_mutex_destroy(&mutex);
return 0;
}



המתנה לחוטים (Joining Threads)


פונקציית `pthread_join` משמשת להמתנה להשלמת החוטים, ומבטיחה שהתוכנית לא תסיים את הריצה שלה עד שכל החוטים שהוזמנו יושלמו:



c
#include <stdio.h>
#include <pthread.h>


void* thread_function(void* arg) {
printf("Thread is running!\n");
return NULL;
}


int main() {
pthread_t thread;


// יצירת חוט חדש
pthread_create(&thread, NULL, thread_function, NULL);


// המתנה להשלמת החוט
pthread_join(thread, NULL);


return 0;
}



טיפים לניהול חוטים


- שימוש בחוטים מוגבלים (Thread Pool): כדי לנהל את יצירת החוטים ולמנוע עומס יתר, ניתן להשתמש בחוטים מוגבלים (Thread Pool).
- הימנעות מ-deadlocks: השתמש בסוגרנים (mutexes) וולכים בזהירות כדי למנוע מצב של deadlock.
- ביצוע פרופיל של ביצועים: ניתוח של ביצועי התוכנית יכול לעזור לזהות צווארי בקבוק ולשפר את ההתפלגות של המשימות בין החוטים.


סיכום


במדריך זה למדנו על תכנות מקבילי בשפת C, כולל יצירת חוטים באמצעות `pthread_create`, שימוש בנתונים משותפים עם mutexes, המתנה לחוטים עם `pthread_join`, וטיפים לניהול חוטים. תכנות מקבילי מאפשר ביצוע יעיל של משימות רבות במקביל ומשפר את ביצועי התוכנה.


אם יש לכם שאלות נוספות או אתם זקוקים לעזרה נוספת, אתם מוזמנים לשאול! ?