תכנות תור דו צדדי ב multi thread - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

תכנות תור דו צדדי ב multi thread


עוד אחד

Recommended Posts

אני צריך לממש תור דו צדדי ב multi thread.

האם יש פתרון לנעילות, שהוא טוב יותר מהנעילה הטריוויאלית ? (כל פעולה על התור נחשבת לקטע קוד קריטי)

בינתיים פסלתי נעילה לכל צד, + נעילה כללית, + שימוש ב counter.

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

קישור לתוכן
שתף באתרים אחרים

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

אופציה עוד יותר קיצונית - להשתמש במנעולים שונים לקריאה ולכתיבה. ככה תאפשר לכמה לקוחות לקרוא מהתור בו זמנית, אבל ברגע שאחד מהם מנסה לשנות את התור (להכניס/להוציא איבר) אז הוא יהיה נעול כולו, גם לקריאה וגם לכתיבה.

קישור לתוכן
שתף באתרים אחרים

בעברית זה קל.

איך אני מגדיר במחשב מהי "הפעולה האחרונה". זו הבעיה.

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

ורצף של POP בשלב הזה, יכול להוציא לי את כל אברי הרשימה.

כשהPUSH של הצד השני יחזור לפעולה, הוא יקבל segmentation fault.

נ.ב.

לפני שאתם אומרים - counter

זה לא עבד לי. כי יכול להיות שבין הבדיקה של הcounter לפעולה המתאימה שבעקבות הבדיקה, התהליך מתחלף...

אולי עשיתי משהו לא בסדר ?

זה מקרה דיי כללי... אף אחד לא מכיר פתרון מדף לבעיה הזו ? לא עזר.

קישור לתוכן
שתף באתרים אחרים

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

הבדיקה האם אתה מוציא את האיבר הזה או לא תתבצע בתחילת התהליך והיא תנעל את 2 הצדדים, אבל אחרי הבדיקה הזו אתה יכול לשחרר את הMUTEX ולעבוד בלי הפרעה.

קישור לתוכן
שתף באתרים אחרים

אוקיי, הבנתי עכשיו.

הבעיה היא שזה קצת אמורפי. מה האיבר הזה ? כל איבר שאינו בקצוות ? (ואז כל 2 פעולות עוקבות של POP בצד מסויים יתחילו לנעול את הכל...)

קיוויתי שאולי מישהו מכיר איזה פתרון סטנדרטי של השטות הזו.

אני אשבור את הראש עם הנעילות עד שנסדר את זה.

תודה בכל מקרה.

קישור לתוכן
שתף באתרים אחרים

נפתר.

מכיוון שאני חסיד גדול של חלוקת הידע באינטרנט -

הפתרון הוא 2 mutexים, אחד לכל צד,

+ מונה, שאם מספר האיברים <= 3 ידאג לנעול גם את הצד השני.

+ mutex שנועל את כל הקטע של הפעלת הנעילות (למניעת deadlock)

תודה בכל זאת למי שניסה לעזור.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...