כיצד להשתמש ב-Multithreading ב-C++

Kyzd Lhstms B Multithreading B C



ריבוי השחלות הוא הרעיון של הפעלת שרשורי ביצוע מרובים בתוך תוכנית אחת. זוהי תכונה שימושית מאוד בשפות תכנות כמו C++ שכן היא מאפשרת לנו לבצע מספר פעולות במקביל. ב-C++, ריבוי השחלות ניתן להשיג באמצעות ה ספרייה, המספקת קבוצה של מחלקות ופונקציות המאפשרות למפתחים ליצור, לנהל ולשלוט במספר שרשורים.

ריבוי השחלות זה בדיוק כמו ריבוי משימות. זה אומר ששני שרשורים או יותר פועלים בו זמנית. בתוכנית כזו, כל רכיב מכונה שרשור, וכל שרשור מציין נתיב ביצוע ייחודי. אין תמיכה מובנית עבור רב חוטים תוכניות לפני C++ 11. תכונה זו מסופקת לחלוטין על ידי מערכת ההפעלה.







ריבוי השחלות ניתן להתייחס גם כחלוקת תוכנית לשרשורים קטנים יותר המופעלים במקביל. מחלקת החוטים, המשמשת עבור ריבוי השחלות ב-C++, מאפשר לך לבנות שרשורים רבים ולנהל את ביצועם.



צור שרשורים ב-C++

כדי ליצור שרשור ב-C++, אנו משתמשים ב- std::thread class, הכלולה בספריית השרשורים המובנית. א ניתן להתקשר מסופק כארגומנט לבנאי של אובייקט של המחלקה std::thread על מנת ליצור שרשור חדש. קוד שמופעל כאשר שרשור פעיל ידוע בשם ניתן להתקשר . כאשר אנו בונים א std::thread אובייקט, נוצר שרשור חדש, שגורם לקוד שסופק על ידי ניתן להתקשר להתנהל. ניתן להתקשרות ניתן להגדיר באמצעות שלוש השיטות הללו.



שיטה 1: מצביע פונקציה

ניתן להתקשרות ניתן להגדיר פונקציות באמצעות מצביע פונקציות כך.





void function_call ( פרמטרים )

כאשר הפונקציה נבנתה, נוצר אובייקט שרשור המכיל את הפונקציה באופן הבא:



std::thread thread_obj ( function_call, פרמטרים ) ;

שיטה 2: אובייקט פונקציה

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

class Object_class {
מפעיל ריק ( ) ( פרמטרים )
{
// קוד לביצוע
}
} ;
std::thread thread_object ( Object_class ( ) , פרמטרים )

שיטה 3: ביטוי למדה

ניתן להתקשרות ניתן להגדיר פונקציות באמצעות ביטוי למבדה כך.

אוטומטי f = [ ] ( פרמטרים ) {
// קוד לביצוע
} ;
std::thread thread_object ( f, פרמטרים ) ;

דוגמה ל-Multithreading ב-C++

#include
#include
שימוש במרחב שמות std;

void func_thread ( int N )
{
ל ( int i = 0 ; אני < נ; i++ ) {
cout << 'שרשור 1 :: ניתן להתקשר => באמצעות מצביע פונקציה \n ' ;
}
}

כיתה thread_obj {
פּוּמְבֵּי:
מפעיל ריק ( ) ( int n ) {
ל ( int i = 0 ; אני < n; i++ )
cout << 'שרשור 2 :: ניתן להתקשר => באמצעות אובייקט פונקציה \n ' ;
}
} ;

int main ( )
{

אוטומטי f = [ ] ( int n ) {
ל ( int i = 0 ; אני < n; i++ )
cout << 'שרשור 3 :: ניתן להתקשר => באמצעות ביטוי למבדה \n ' ;
} ;

חוט th1 ( func_thread, 2 ) ;

חוט th2 ( thread_obj ( ) , 2 ) ;

חוט th3 ( ו, 2 ) ;

th1.join ( ) ;

th2.join ( ) ;

th3.join ( ) ;

לַחֲזוֹר 0 ;
}

בקוד לעיל, פיתחנו שלושה שרשורים עם שלושה נפרדים ניתנים להתקשרות - מצביע פונקציה, אובייקט וביטוי למבדה. כל שרשור מתחיל כשני מופעים נפרדים. שלושה חוטים פעילים במקביל ובנפרד, כפי שמצוין בפלט.

תְפוּקָה

יתרונות וחסרונות של ריבוי השחלות

יותר עבודה יכולה להיעשות מהר יותר בזכות ריבוי השחלות . הסיבה לכך היא שהיא מאפשרת לשרשורים רבים לבצע משימות שונות בבת אחת. ריבוי השחלות מאפשר למתכנתים לבצע פעילויות רשת, לעבד תמונות או סרטונים ולבצע חישובים מסובכים מבלי להאט את שאר האפליקציה. ריבוי השחלות עוזר להפוך את ממשקי המשתמש למגיבים יותר. על ידי הפעלת הקוד שמשנה את המסך בשרשור נפרד, שרשור ה-UI נשמר חופשי לבצע משימות אחרות, כגון תגובה לקלט של המשתמש. זה מביא לממשקי משתמש חלקים ומהירים יותר.

עם זאת, יש כמה מגבלות לשימוש ריבוי השחלות . אחד האתגרים המרכזיים בעבודה עם רב חוטים תוכניות הימנעות מתנאי מירוץ. מצב גזע הוא מצב שבו שני שרשורים או יותר מנסים לגשת לאותו משאב משותף בו-זמנית, מה שמוביל להתנהגות בלתי צפויה. כדי להימנע מתנאי גזע, מפתחים משתמשים בטכניקות סנכרון כמו מוטקסים, סמפורים ומחסומים.

סיכום

ריבוי השחלות ב-C++ הוא רעיון רב עוצמה המאפשר למפתחים ליצור תוכניות שיכולות לבצע מספר משימות בו זמנית. על ידי שימוש במחלקת השרשורים שמספקת הספרייה, מפתחים יכולים ליצור, לנהל ולשלוט במספר שרשורים. ריבוי השחלות ניתן להשתמש כדי לשפר את הביצועים, להגביר את ההיענות ולהתגבר על מגבלות משאבי המערכת. עם זאת, בשל האתגרים הכרוכים בעבודה עם רב חוטים תוכניות, מפתחים צריכים להיות זהירים ולהשתמש בטכניקות סנכרון מתאימות כדי להימנע מתנאי מרוץ.