2012-02-04 15 views
7

सी पॉइंट लाइब्रेरी में localtime जैसे फ़ंक्शंस पर विचार करें जो एक (ऐतिहासिक रूप से) स्थिर बफर में एक सूचक लौटाते हैं। क्या सी 11 इन बफर को थ्रेड-स्थानीय बनाता है?सी 11 थ्रेड-सुरक्षा उन कार्यों के संबंध में जो स्थिर बफर

प्रति 7.1.4 सी 11 में:

स्पष्ट रूप से विस्तृत विवरणों का वह पालन में अन्यथा न कहा गया जब तक, पुस्तकालय कार्यों डेटा दौड़ को रोकने जाएगा इस प्रकार है: एक पुस्तकालय समारोह करेगा प्रत्यक्ष या परोक्ष रूप पहुंच वस्तुओं धागे से सुलभ नहीं वर्तमान धागे के अलावा जब तक कि फ़ंक्शन के तर्कों के माध्यम से वस्तुओं को प्रत्यक्ष या परोक्ष रूप से एक्सेस नहीं किया जाता है। एक लाइब्रेरी फ़ंक्शन वर्तमान थ्रेड के अलावा थ्रेड द्वारा सुलभ वस्तुओं को सीधे या परोक्ष रूप से संशोधित नहीं करेगा जब तक कि ऑब्जेक्ट को फ़ंक्शन के गैर-कॉन्स्ट तर्कों के माध्यम से प्रत्यक्ष या अप्रत्यक्ष रूप से एक्सेस न किया जाए। कार्यान्वयन थ्रेड के बीच अपनी आंतरिक वस्तुओं को साझा कर सकते हैं यदि ऑब्जेक्ट उपयोगकर्ताओं को दिखाई नहीं दे रहे हैं और डेटा दौड़ के विरुद्ध सुरक्षित हैं।

उदाहरण के लिए localtime पर विचार करें। struct tm जिसके लिए इसके वापसी मूल्य बिंदु "आंतरिक ऑब्जेक्ट" के रूप में योग्य नहीं होते हैं क्योंकि यह कॉलर के लिए सुलभ है, इसलिए ऐसा लगता है कि localtime का एक अन्य थ्रेड में एक आवेदक पहले थ्रेड में पहले परिणाम को वापस नहीं कर सकता है। यह इंगित करेगा कि localtime प्रत्येक थ्रेड के लिए एक अलग बफर का उपयोग करने की आवश्यकता है।

हालांकि, मानक उस ऑब्जेक्ट के जीवनकाल को समाप्त नहीं करता है जिसका पता वापस आ गया है, और मुझे कोई कारण नहीं है कि कॉलिंग थ्रेड टर्मिनेट्स अमान्य होने के बाद इस struct tm का उपयोग करने वाला कोई प्रोग्राम अमान्य नहीं होगा। इस प्रकार, ऑब्जेक्ट में थ्रेड स्टोरेज अवधि नहीं हो सकती है।

एकमात्र तरीका यह है कि मैं यह जान सकता हूं कि एक कार्यान्वयन सभी आवश्यकताओं को पूरा कर सकता है, जो पूरे स्थान पर स्मृति को रिसाव करना है, जो निश्चित रूप से इरादा नहीं है। क्या मुझे कुछ स्पष्ट याद आ रही है, या विरासत इंटरफेस के संबंध में सी 11 के थ्रेड-सुरक्षा का इलाज वास्तव में यह खराब विचार-विमर्श है?

उत्तर

8

... unless explicitly stated otherwise: 7.27.3 Time conversion functions का प्रारंभिक अध्याय स्पष्ट रूप से बताता है कि इन कार्यों को डेटा दौड़ से बचने के लिए नहीं माना जाता है। (जैसा कि कई अन्य लाइब्रेरी फ़ंक्शंस के मामले में है।)

_s प्रत्यय के साथ व्युत्पन्न कार्य मानक मानक अनुबंध में विस्तार की सीमा में विस्तारित किया गया है जो रेस स्थितियों से बचने के लिए डिज़ाइन किए गए हैं।

+0

ठीक है, मैंने कार्यों के लिए विशिष्ट दस्तावेज देखा, लेकिन परिचय नहीं। ऐसा लगता है कि आपको पता चला कि मैं क्या खो रहा था। –

संबंधित मुद्दे