האם errno בLinux הוא thread safe?

selalerer

New member
האם errno בLinux הוא thread safe?

אני כרגע יוצר מספר threadים שמשתמשים בaccept ובrecv ושתי הפונקציות האלו עושות שימוש בerrno, השאלה היא האם יש לי מופע אחד של errno עבור כל הprocess ואז יהיה לי טעויות בבדיקת errno (יכול להיות שעודכן כבר על ידי thread אחר). תודה, סלע.
 

voguemaster

New member
כן

יש לך מופע של errno לכל thread שאתה יוצר, כן. כל ה-threadים משתפים את הדברים הבאים: 1. קטעי הקוד של ה-PROCESS שבו הם רצים. 2. רוב המידע (אם כי הוא לא נגיש בכל SCOPE אפשרי). 3. קבצים פתוחים (כלומר file descriptors). 4. כל ה-signal handlers. 5. מחיצת העבודה הנוכחית. 6. הרשאות user ו-group. יחד עם זאת לכל thread יש את הדברים הבאים משלו: 1. thread ID 2. סט רגיסטרים מלא (כולל stack pointer כמובן!). 3. מחסנית עבור משתנים לוקליים וכתובות חזרה. 4. errno 5. signal mask 6. קדימות ביחס לשאר ה-threadים (יענו priority). רק דבר אחד חשוב לציין: יש כמה משתנים של ה-resolver בלינוקס שהם *לא* thread safe. אלו הם: 1. המבנה הסטטי שמשמש את ה-resolver כשאתה קורא ל-gethostbyXXX 2. ה-errno המיוחד של ה-resolver שנקרא h_errno והוא יחיד בין כל ה-threadים!!
 
למעלה