קטע קריטי – הבדלי גרסאות

נוספו 13 בתים ,  לפני חודשיים
(אחידות במיקום הערות שוליים)
 
האלגוריתם של פטרסון לא משתמש בכלים מיוחדים לפתרון בעיית הקטע הקריטי אלא עושה זאת באמצעים הרגילים שעומדים בפני המתכנת ובעזרתם הוא מתמודד עם כל הגורמים שדורשים טיפול:
* מניעה הדדית – כאשר אחד התהליכים נמצא בקטע הקריטי שלו, לא משנה איפה תתבצע החלפת הקשר וכמה פעמים, התהליך השני לא יוכל להיכנס לקטע הקריטי שלו, כלומר לגשת למשאב המשותף בזמן שהתהליך הראשון לא סיים להשתמש בו. הסיבה לכך היא שתהליך P<sub>i</sub> נכנס לקטע הקריטי שלו רק כאשר <code>flag[i] = true</code> ובנוסף הוא לא יעבור את [[לולאה (תכנות)|לולאת]] ה־<code>while</code> אלא אם כן התהליך השני לא הראה רצון להיכנס לקטע הקריטי (בתווית P0 או P1) או שהתהליך השני נמצא לפני הקטע הקריטי שלו ובדיוק עכשיו הציע לתהליך הראשון להקדים אותו (בתווית P1_gate או P0_gate). התהליך P<sub>i</sub> לא משנה את <code>turn</code> בזמן שהוא בקטע הקריטי, מה שמביא למסקנה ש־<code>turn = i</code> כאשר התהליך השני רוצה להיכנס לקטע הקריטי ולכן, כל עוד תהליך P<sub>i</sub> נמצא בקטע הקריטי שלו, התהליך השני לא יוכל לעבור את לולאת ה־<code>while</code>.
* התקדמות – כאשר תהליך P<sub>i</sub> סיים את הקטע הקריטי, הוא מבצע <code>flag[i] = false</code> ולכן אם התהליך השני יוכל לעבור את ה־<code>while</code>.
* המתנה מוגבלת – כאשר P<sub>i </sub>נמצא ב־<code>while</code> אז התהליך השני לא יוכל להריץ את הקטע הקריטי שלו יותר מפעם אחת מכיוון שהוא יהיה חייב לשנות <code>turn = i</code> ו־P<sub>i</sub> כבר סימן <code>flag[i] = true</code> ולכן הוא לא יעבור את ה־<code>while</code> עד ש־P<sub>i</sub> לא יבצע את הקטע הקריטי שלו.