עבור לתוכן

מה זה thread safety או thread safe

Featured Replies

פורסם

שלום לכולם :)

רציתי לדעת מה זה Thread Safety או Thread Safe כי נתקלתי במושג הזה ולא כל כך הבנתי מה הוא אומר.

אשמח אם אוכל לקבל הגדרה של המושג שאוכל להבין יותר טוב.

תודה

פורסם

קודם כל, אתה יודע מה זה Thread? (קרוי גם נים או תהליכון)

פורסם
  • מחבר

ברור :xyxthumbs:

באותו התהליך (Process) יכולים לרוץ כמה תהליכונים (או נימים או חוטים איך שלא תקרא לזה) במקביל.

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

פורסם

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

לדוגמה, נניח שיש איזשהו משתנה בשם x, ושני נימים מנסים להוסיף לו 1. איך זה עובד? כל נים צריך לקרוא את המשתנה מהזכרון, להוסיף לו 1, ולכתוב את התוצאה בחזרה לזכרון. אז אם לדוגמה ערכו ההתחלתי הוא 0, ושני נימים מנסים לעשות את הפעולה הזו בדיוק בו זמנית, זה מה שיקרה (זה כמובן פישוט של מה שיקרה באמת, אבל זה רק לצורך ההדגמה):

1. נים א' יקרא 0 מ-x שיושב בזכרון.

2. נים ב' יקרא 0 מ-x שיושב בזכרון.

3. נים א' יוסיף 1 לערך שהוא קרא.

3. נים ב' יוסיף 1 לערך שהוא קרא.

4. נים א' יכתוב את הערך 1 לתוך x.

5. נים ב' יכתוב את הערך 1 לתוך x.

אז למרות ש-x היה אמור לגדול ב-2, הוא רק גדל ב-1.

השגיאה הזו נקראת Race Condition, וקטע הקוד הזה שמשתמש במשאב משותף (המשתנה x) נקרא "קטע קריטי". קטע קוד (או פונקציה, או מחלקה) קרוי Thread Safe אם שני ת'רדים יכולים להפעיל אותו זו זמנית בלי חשש לשגיאות כאלה. בשביל להפוך קטעי קוד ל-Thread safe צריך להשתמש במנגנוני נעילה, סנכרון ותיאום בין ת'רדים, שבד"כ מובנים בתוך השפה. לדוגמה, בג'אווה אפשר להשתמש במילה השמורה synchronized, שדואגת שאת קטע הקוד או הפונקציה רק ת'רד אחד יוכל להפעיל בכל רגע נתון (אם עוד ת'רד מנסה להפעיל את הפונקציה, אז הוא צריך לחכות עד שהקודם יסיים):

http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

פורסם

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

פורסם
  • מחבר

וואי תודה רבה על ההסבר שניצל הבנתי את זה ממש טוב :) תמשיך בעבודה הטובה

ול - yigal_o, הבנתי, אבל כעיקרון השפות שאני מכיר הכי טוב הן Java ו - C#

פורסם

לשפה אין שום משמעות.

אגב, מומלץ לקרוא על כל הנושא של תכנות מקבילי. בעיות של מניעה הדדית (mutual exclusion) חשובות מאוד להכרה ופתרון.

פורסם

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

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

ארכיון

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

דיונים חדשים