שני סנט על תכנות MT

rontech

New member
שני סנט על תכנות MT

נניח שישי לי 2 פונקציות לסנכרן....
f() x++
g() x--
אני מנסה למפות את הסינכרון של כל שורת קוד עם עצמה (הצידה).... למשל בדוגמה לעיל ++x צריך סנכרון עם עצמו ופה איזה lockincrement יכול להתאים.....
צריך גם לחפש איפה צריך סנכרון בין שורות קוד בפונקציות שונות (למעלה למטה)... בדוגמה הזאת צריך לסנכרן בין ++x לבין --x...... אז כנראה יתאים פה איזה קטע קריטי....

ונראה את הקוד הבא... בסה"כ שתי שורות קוד....
x++
y--
בזמן שחוט אחד נמצא בין שתי פקודות.... אלף חוטים אחרים יכולים (תאורטית) לעשות די הרבה דברים....

והדבר האחרון.... צריך לחפש תסריטים שבהם עלול להיווצר dead lock......

 

user32

Well-known member
מנהל
סנכרון הוא לא על שורות קוד אלא פעולות

במקרה שלך מדובר בגישה למשאבים משותפים. זה יקל עליך את החשיבה. אם יש משאב, במקרה שלך משתנה, ששני חוטים יכולים לגשת אליו אז יתכן וצריך לסנכרן את הגישה אליו.

זה לא משנה אם הגישה נעשית באותה פונקציה ששני חוטים קוראים לה או בפונקציות שונות.

dead lock הוא רק מצב אחד מני רבים שצריך להמנע ממנו. thread starvation למשל הוא לא פחות חשוב.

ואם כבר שני סנט:
במשתנה פנימי בתוך סקופ של פונקציה אין צורך לסנכרן כיוון שלכל פונקציה הקצאה משלה על הstack. כך שאם היה לך

f(){
int x = 0;
x++
}

אין בעיה שחוטים מרובים יקראו לה במקביל. המשתנה עדיין יהיה קונסיסטנטי.
 

rontech

New member
תודה


בדוגמה שהבאתי הכוונה הייתה למשתנה שממשיך להתקיים גם מחוץ לקוד של הפונקציה כמו למשל בקוד הבא....
class A
{
int x;
f() {x++;}
g() {x--;}
};
 
למעלה