5.8 תהליכונים תרגול
תרגול - תהליכונים - threads¶
זכרו לקמפל עם הדגל -lpthread:
תרגיל 1 - יצירת threads בסיסית¶
כתבו תוכנית שיוצרת 3 threads. כל thread מדפיס את מספר ה-thread שלו ("thread 0", "thread 1", "thread 2"). ה-thread הראשי ממתין לכל ה-threads עם pthread_join.
רמז: תעבירו את מספר ה-thread כארגומנט לפונקציה דרך הפרמטר arg של pthread_create.
תרגיל 2 - מרוץ תחרות - Race Condition¶
כתבו תוכנית עם משתנה גלובלי counter שמתחיל מ-0. צרו 2 threads, כאשר כל אחד מגדיל את counter מיליון פעמים (1000000). בסוף הדפיסו את הערך הסופי.
הריצו כמה פעמים - האם התוצאה תמיד 2000000? הסבירו למה לא.
תרגיל 3 - תיקון עם mutex¶
קחו את התוכנית מתרגיל 2 והוסיפו mutex כדי להגן על הגישה ל-counter. ודאו שהתוצאה הסופית תמיד 2000000.
תרגיל 4 - העברת ארגומנט וקבלת ערך חזרה¶
כתבו תוכנית שבה ה-thread הראשי יוצר thread בן ומעביר לו מחרוזת כארגומנט. ה-thread הבן מדפיס את המחרוזת ומחזיר את אורכה כערך חזרה (דרך pthread_join).
ה-thread הראשי מקבל את אורך המחרוזת ומדפיס אותו.
רמז: ערך ההחזרה של thread הוא void*. אפשר להמיר int ל-void* ובחזרה עם cast.
תרגיל 5 - חישוב מקבילי¶
נתון מערך של 1000000 מספרים שלמים (אתחלו את כולם לערך 1 לפשטות).
כתבו תוכנית שיוצרת 4 threads, כאשר כל thread מחשב את הסכום של רבע מהמערך (thread 0 מסכם את האינדקסים 0-249999, thread 1 מסכם 250000-499999, וכו').
כל thread שומר את הסכום החלקי שלו. ה-thread הראשי ממתין לכולם ומסכם את 4 התוצאות החלקיות.
רמז: צרו struct שמכיל את המידע שכל thread צריך (פוינטר למערך, אינדקס התחלה, אינדקס סיום, ומקום לשמור את התוצאה).