שיעור 12: מרוצי נתונים, Deadlock ואטומיות
שיעור זה מעמיק בשלושה איומים קשים לניפוי: data race (הגדרה מדויקת ב-C++), deadlock (שני threads שמחכים זה לזה), ופעולות אטומיות (std::atomic) כחלופה קלה למutex עבור מונים פשוטים.
data race = שניים כותבים על אותו נייר בו-זמנית. deadlock = שניים מחזיקים מה שהשני צריך ומחכים. atomic = פעולה שלמה — אי אפשר לחצות אותה.
- data race (מרוץ נתונים)
- לפי תקן C++: שני threads ניגשים לאותו מיקום זיכרון, לפחות אחד כותב, ואין synchronisation ביניהם. גורם ל-undefined behavior.
- התנהגות לא מוגדרת (UB)
- מצב שבו תקן C++ אינו מגדיר מה יקרה — הקומפיילר יכול לייצר כל קוד, כולל crash, ערכים שגויים, או אפילו 'לעבוד' לעיתים.
- deadlock (מבוי סתום)
- מצב שבו שני threads או יותר מחכים זה לזה לשחרור mutex, ואף אחד לא יכול להתקדם לנצח.
- אטומי
- פעולה שמתבצעת כיחידה בלתי-ניתנת לחציה. std::atomic<T> ב-C++ מבטיח שקריאה-שינוי-כתיבה לא תיקטע על-ידי thread אחר.
- compare-exchange
- פעולה אטומית שמשווה ערך נוכחי לערך צפוי; אם שווים — מחליפה לערך חדש. בסיס ל-lock-free algorithms.