multi-threading

otherside3

New member
multi-threading

שלום לכולם.
שאלה שנתקלתי בה במבחן מאוניברסיטה בחו"ל ואני לא בטוח אם אני מבין את התשובה.
בשאלה עצמה נתון קטע main ואחריו 3 מימושים לפונקציה, כאשר נתון בפתיח של השאלה:
You may assume, for the purposes of this problem, that printf executes atomically
השאלה שלי מתייחסת רק לאחד המימושים, לכן אביא רק אותו

קוד:
sem_t sem;

int i = 0;
void *doit(void *arg)
{
 i = i + 1;
 printf("%d\n", i);
}

int main()
{
 int j;
 pthread_t tids[3];
 sem_init(&sem, 0, 1);
 for (j=0; j<3; j++) {
   pthread_create(&tids[j], NULL, doit, NULL);
 }
 for (j=0; j<3; j++) {
   pthread_join(&tids[j], NULL);
 }
return 0;
}


השאלה: מבין האפשריות הבאות, לפחות אחת אינה יכולה להיות פלט חוקי של התוכנית. ציין מהו/ה הפלט.
1 2 3
3 3 3
1 3 1
1 1 1

ע"פ התשובות של המבחן, רק פלט 3 (131) אינו יכול להיות חוקי.
אני מבין למה פלט 2 ופלט 4 חוקיים, ואני מבין למה פלט 3 לא חוקי, אך אני לא מבין לגבי פלט 1 הוא חוקי. ניסיתי למצוא סדרת פעולות שיביאו אותי לתוצאה הזאת, ונראה שמצאתי אבל היא לא מקיימת את ההנחה שבתחילת השאלה ש-printf היא אטומית (כלומר, אם אני מבין נכון את המשמעות של זה, היא גם קוראת את הערך של i וגם מדפיסה אותו למסך בפעולה אחת ולא מבצעת
context switch באמצע)

האם יש טעות בפתרון? או האם יש כאן משהו שאני לא רואה נכון?

תודה!
 

bismark1

New member
אמנם לא התעמקתי

אבל על פניו - מה המניעה שיווצר הThread הראשון, יגדיל את i, ידפיס ורק אז יווצר הthread הבא וכן הלאה? במקרה הזה תקבל 1,2,3
 

selalerer

New member


 

otherside3

New member
המספרים נקראים משמאל לימין

על המסך צריך להיות מודפס
3
2
1

ולא
1
2
3
 

selalerer

New member
הקריאה של i נעשית לפני ש-printf נקרא.

אין אטומיות בין הקריאה של i לבין ההרצה של printf.
 

otherside3

New member
אוקי, טוב לדעת את זה

זה עכשיו מסתדר לי עם רצף הפעולות שהגעתי אליו..

תודה!
 

selalerer

New member
באופן כללי כדאי להבין שמה שאתה לומד פה הוא קצת פשטני.

זה תרגיל מחשבתי נחמד ברמת הסיבוכיות הנוכחית שנותנים לכם, אבל במציאות הדברים יותר מורכבים. בתלות בארכיטקטורת מעבד וחומרה, בקומפיילר ובדגלים שמועברים לקומפיילר, יכולים להיות מצבים נוספים: i יכול להיות באוגר ופרטי ל-thread, יש את נושא ה-cache של המעבד ומתי נקרא הזיכרון אל ה-cache ומתי נכתב חזרה. אולי בכלל קריאה וכתיבה ל-i הם לא פעולה אטומית וכו'.
 
למעלה