תהליכים, תהליכונים, סנכרון, ניהול זיכרון ומערכות קבצים
Lock(int *m) (MUTEX) וממשו בדרך הפשוטה ביותר את שחרור המנעול Unlock(int *m).++counter):atomic_change(variable, value). ערך ה value יכול להיות חיובי או שלילי.compare_and_swap יכולים להיות משתנה וביטוי אריתמטי, לדוגמא: CAS(&val, exp, new + 1). בביטוי אריתמטי אפשר להשתמש גם במשתנה במקום המספר.Enqueue(item) מכניסה לסוף הרשימה ו Dequeue() מוציאה מראש הרשימה. שתי הפונקציות מעדכנות את המצביעים לראש וסוף הרשימה בהתאם. שתי הפונקציות לא משתמשות באמצעי הסנכרון.counter במצב הזה?Enqueue(item) מכניסה לסוף הרשימה ו Dequeue() מוציאה מראש הרשימה. שתי הפונקציות מעדכנות את המצביעים לראש וסוף הרשימה בהתאם.Dequeue() תמיד דואגת להשאיר לפחות פריט אחד במאגר. לא צריך להתייחס לשאלה מה הסיבה לזה. אם יש רק פריט אחרון במאגר, היא מחזירה NULL וזה מטופל בקוד של צרכן עצמו (שקורא ל ConsumerFunction()).while (entering[j]) { /* noop */ }.שאלות תרגול במערכות הפעלה בנושא תנאי מרוץ ממבחנים של האוניברסיטה הפתוחה. השאלות ממוינות לפי רמת קושי, עם פתרונות לבדיקה עצמית - כך שניתן ללמוד מטעויות ולהבין את דרך הפתרון לפני הבחינה. ניתן לאתר שאלות חוזרות ולהריץ מבחני סימולציה ממוקדים בנושא תנאי מרוץ.