2011-12-05 20 views
8

पर सी मानक लाइब्रेरी की थ्रेड-सुरक्षा क्या सी मानक पुस्तकालय के मैक ओएस एक्स के कार्यान्वयन में थ्रेड-सुरक्षित फ़ंक्शंस की एक निश्चित सूची है?ओएस एक्स

वहाँ glibc के संबंध और f*() कार्यों के साथ एक अच्छा जवाब here विशेष रूप से है, लेकिन मैं ओएस एक्स के लिए सम्मान के साथ किसी भी तरह के संसाधन खोजने में असफल रहा है वहाँ ऐसी बात है?

उदाहरण के लिए, strptime() और strftime() थ्रेड-सुरक्षित हैं? printf()? ये कुछ ऐसे हैं जिनमें आंतरिक बफर हो सकते हैं जिन्हें मैं गड़बड़ नहीं करना चाहता हूं। :)

+0

एक साइड टिप्पणी के रूप में (डेव और खंडख आपको जवाब देते हैं) भले ही कुछ मानक कार्यों को थ्रेड सुरक्षित होने की गारंटी दी जाती है, जिसका कार्यान्वयन अक्सर उच्च प्रदर्शन दंड के साथ आता है। 'Printf' जैसी चीजें कुख्यात रूप से खराब हैं क्योंकि उनके पास आपके कोड को क्रमबद्ध करने की प्रवृत्ति है। –

उत्तर

3

सिंगल यूनिक्स विशिष्टता a fairly short list of functions that are allowed to be non–thread-safe देता है (सिवाय इसके कि "विरासत फ़ीचर समूह" में फ़ंक्शंस को सूचीबद्ध नहीं होने के बावजूद गैर-थ्रेड-सुरक्षित होने की अनुमति है)। सूची में strtok() शामिल है, जो डेव ने अपने उत्तर में उल्लेख किया है, लेकिन में strptime(), न ही strftime(), न ही printf() शामिल हैं।

This StackOverflow answer दावा करता है कि इस सवाल के जवाब में, ओएस एक्स स्पेक के उपरोक्त पहलू का समर्थन करता है, इसलिए मुझे लगता है कि शायद यह उपयोग करने के लिए सबसे अच्छी सूची है। (आपको शायद उस प्रश्न के बाकी हिस्सों में भी दिलचस्पी होगी, और इसके जवाब में, वैसे भी।)

2

कोई भी कार्य जो कुछ जादुई याद रखने वाली शक्ति प्रतीत होता है, संभवतः थ्रेड-सुरक्षित नहीं होने की संभावना है। कोई भी फ़ंक्शन जो पॉइंटर लौटाता है, आपको free() से अपेक्षा नहीं की जाती है, अक्सर थ्रेड-सुरक्षित नहीं होती है।

कई कार्यों को आपको वास्तव में char*, या struct foo* के बारे में चिंता करने की ज़रूरत है। यद्यपि यह एक आदर्श नियम नहीं है, यह अक्सर एक फ़ंक्शन का संकेतक होता है जिसमें कुछ प्रकार का स्थिर भंडारण होता है, और यह थ्रेड-सुरक्षित नहीं होता है।

strtok() का एक साधारण उदाहरण है, और strtok_r() द्वारा सफल रहा है जो थ्रेड-सुरक्षित है। कई गैर-थ्रेड-सुरक्षित कार्यों के लिए, function_r() (पुनर्विक्रेता के लिए आर) मौजूद है।