עבור לתוכן

semaphores או משהו דומה

Featured Replies

פורסם

אני מנסה להריץ ב C++ שני thread ים במקביל שקוראים לאותן פונקציות.

כדי למנוע פנייה בו זמנית השתמשתי ב critical section אבל בגלל זה נוצר הפרש זמנים שהורס לי משהו בתוכנית.

יש אולי דרך יותר טובה שלא תפגע לי בזמן?

אולי דרך שממש תשכפל את הפונקצייה שנקראת?

פורסם

שני threadים יכולים לקרוא לאותה פונקציה באותו הזמן בלי בעיה.

הבעיה מתחילה כששני threadים מנסים לגשת לאותו משאב ביחד (לדוגמה הזכרון).

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

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

  • 2 שבועות מאוחר יותר...
פורסם
  • מחבר

תודה,

אבל חבל שאין איזה פקודה שאוטומטית משכפלת resources כשמשתמשים בthread

לדוגמא אם כתבתי משהו כבר בעבר ואני לא מעוניין לשנות את הקוד

או במקרה גרוע יותר שהקוד הוא קופסא שחורה מבחינתי ואני לא יודע בדיוק במה הוא ישתמש...

פורסם

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

חוץ מזה, מה זה פקודה אוטומטית? אתה יכול לכתוב בעצמך חבילה שתעשה את זה...

חוץ מזה, יש מקרים שבהם תעדיף להשתמש ב-processים מאשר ב-threadים (ל-processים אין משאבים משותפים, בניגוד ל-threadים).

פורסם

גם אם תדאג ששני thread-ים לא יכנסו לקוד הלא ידוע בו זמנית (לדוגמא ע"י mutex) זה לא מספיק אם הקוד לא reentrant, אם הוא שומר מצב פנימי במקום שאין לך גישה אליו.

באופן כללי קוד שהוא קופסה שחורה ושלא ידוע שהוא thread-safe צריך להתייחס אליו בחשדנות רבה בהקשר זה.

פורסם

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

ארכיון

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

דיונים חדשים