חידה חמודה ששמעתי,

DNile

New member
חידה חמודה ששמעתי,

יש 4 חוטים
סתם, threads, שכל אחד מבצע לולאה של 10 פעם, כשבכל איטרציה הוא מגדיל משתנה גלובלי כלשהוא(global++), שאותחל לפני יצירת הthreads ל0. בהנחה שאין שום סנכרון בין הthreads, אין אופטימיזציה של המשתנה לרגיסטר(כלומר כל הגדלה של המשתנה = קריאה מהזכרון לאוגר, הגדלת האוגר, החזרה לזכרון), ובמערכת יש אך ורק מעבד אחד, מה טווח הערכים שבו יכול להמצא הערך global.
 
איך?../images/Emo26.gif

תרד 1 מתחיל את האיטרציה הראושנה וקורא את הערך של המשתנה הגלובלי (כלומר 0). עכשיו תרד 2 ו-3 רצים ומסיימים. תרד 4 רץ 9 פעמים. תרד 1 - מסיים את האיטרציה הראשונה וכותב "1" למשתנה. תרד 4 מתחיל את האיטרציה העשירית - קורא מהמשתנה את המספר "1". תרד 1 מסיים עוד 9 איטרציות. תרד 4 מסיים את האיטרציה העשירית וכותב למשתנה "2".
 

Fingertip

New member
אי אפשר פחות.

נשים לב שמתקיים: 1) כל אחד מהתהליכונים יכול לכתוב 1 ומעלה, אך לא 0. 2) תהליכון יכתוב 1 אם ורק אם הוא קרא 0. 3) תהליכון יכול לקרוא 0 אך ורק מהאיטרציה הראשונה שלו. (ברור מאליו, הא
) כעת, אם כתוב 1 הרי שהתהליכון האחרון שכתב למשתנה כתב 1, ולכן הוא קרא 0. אבל אז לפי 3, הוא נמצא באיטרציה הראשונה שלו, ולכן יש לו עוד 9 לבצע שבהן הוא ישנה את ערך המשתנה למספר גבוה יותר. מש"ל. אהד.
 

DNile

New member
להבא - לא רושמים פתרון בשורת נושא.

אלא משהו בסגנון של: "התשובה" או משהו כזה, שאחרים יוכלו לשבור את הראש גם. והמשך לחידה:
int global = 0; void ThreadFund() { for(int i = 0; i < 10; i++) { criticalSection.Enter(); global++; criticalSection.Leave(); } }​
מחליטים להגן על המשתנה באמצעות Critical Section, ותוך כדי גם מוסיפים מעבד נוסף למערכת. א. האם יש בעייתיות בעבודה עם שני מעבדים? ב. בהתחשב בבעייתיות זאת, איזה ערכים(תנו תחום ערכים מדויק, לא רק מינימום ומקסימום) נוכל לקבל אחרי ש4 הthreads רצים?
 
למעלה