האם זה תכנות נכון?

danbars

New member
לא

- מה, לא ? - לא ! מי שלא יודע לתכנת ולא שומר על הפילוסופים שלו, אז מצידי שיהיו רעבים לנצח !
 

הצלוי

New member
זאת גישה של שנות השבעים../images/Emo13.gif

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

vinney

Well-known member
זה לא נכון

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

הצלוי

New member
זה לא עניין של עדיפויות?

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

vinney

Well-known member
זהו שלא תוסיף

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

zivsh103

New member
...

try to consider a manager that knows if the semaphore is free or not and if so, who has it. all requests for the semaphore go to the manager who can make the decision what to do: 1. allocate the semaphore to the resource (if free), lock it... 2. deny the request (semaphore in use) just as the semaphore needs to be only free/used, so does the resource (philospher) - it only needs to know if it is active (has a semaphore) or idle. The manager has the relationships and the logic of the systems (can check how many resources are active, handle new requests, free the semaphore...) hope this helps...I would be happy to hear opinions.​
 

nahsh

New member
אפשר לפתור גם עם desigen patterns

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

ahab

New member
כמעט..

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

CoolerMaster

New member
עוד קצת סדר

בתגובה לדברי danbars וכל השאר. המילה synchronized יכולה להיות מצורפת לפונקציה או לקטע קוד (block) ולא למחלקה או דברים כאלה. מה שקורה מאחורי הקלעים הוא ש- thread שמנסה להפעיל את הפונקציה הזו, מנסה בעצם להחזיק במנעול (lock -> כמו ה- mutex בשפות אחרות). המנעול הוא בעצם אובייט, או אובייקט מפורש או האובייקט this. כאשר ה-thread אוחז במנעול, thread אחר כמובן לא יכול לאחוז באותו מנעול עד שה-thread הראשון לא משחרר אותו. כמובן שיש להיזהר מ- deadlock בתכנות רב תהליכי.
 
למעלה