पुन: प्रवेशी कार्यों सी
में (उदाहरण के लिए) है कि सी पुस्तकालय हेडर में संपर्क में हैं .. strtok() strtok_r बनाम ले वैश्विक चर पर भरोसा नहीं करते
कुछ कार्य एक जगह की जरूरत है एक स्टोर करने के लिए ' काम प्रगति पर है, फिर से प्रवेश करने वाले कार्यों से आप इस सूचक को थ्रेड के अपने भंडारण के भीतर निर्दिष्ट कर सकते हैं, न कि वैश्विक में। चूंकि यह संग्रहण कॉलिंग फ़ंक्शन के लिए अनन्य है, इसलिए इसे बाधित किया जा सकता है और (पुन: प्रवेशकर्ता) फिर से दर्ज किया गया है और चूंकि अधिकांश मामलों में पारस्परिक बहिष्करण से कार्य करने के लिए फ़ंक्शन लागू करने की आवश्यकता नहीं होती है, उन्हें अक्सर माना जाता है धागा सुरक्षित होने के लिए। हालांकि, यह परिभाषा द्वारा गारंटीकृत नहीं है।
errno, तथापि, POSIX सिस्टम पर एक अलग मामले (के रूप में है (और कैसे इस का कोई स्पष्टीकरण नहीं में oddball सभी कार्यों हो जाता है) :)
संक्षेप में, रैत्रांत अक्सर धागा सुरक्षित मतलब है यदि आप थ्रेड का उपयोग कर रहे हैं तो "उस फ़ंक्शन के पुनर्विक्रेता संस्करण का उपयोग करें"), लेकिन थ्रेड सुरक्षित हमेशा पुनः प्रवेश (या विपरीत) का मतलब नहीं है। आप धागे की सुरक्षा पर नज़र डालते समय, संगामिति क्या आप के बारे में सोच करने की आवश्यकता है। यदि आपको किसी फ़ंक्शन का उपयोग करने के लिए लॉकिंग और पारस्परिक बहिष्करण का साधन प्रदान करना है, तो फ़ंक्शन अंतर्निहित थ्रेड-सुरक्षित नहीं है।
लेकिन, सभी कार्यों को किसी भी के लिए जांचने की आवश्यकता नहीं है। malloc()
रैत्रांत होने के लिए, यह किसी भी थ्रेड के लिए प्रवेश बिंदु के दायरे से बाहर कुछ भी पर निर्भर नहीं करता कोई जरूरत नहीं है (और खुद को सुरक्षित थ्रेड है)।
स्थिर आवंटित मान वापस करने वाले कार्य थ्रेड सुरक्षित नहीं हैं, बिना किसी म्यूटेक्स, फ्यूटेक्स, या अन्य परमाणु लॉकिंग तंत्र के उपयोग के बिना। फिर भी, अगर उन्हें बाधित नहीं किया जा रहा है तो उन्हें पुनर्वित्त करने की आवश्यकता नहीं है।
यानी .:
static char *foo(unsigned int flags)
{
static char ret[2] = { 0 };
if (flags & FOO_BAR)
ret[0] = 'c';
else if (flags & BAR_FOO)
ret[0] = 'd';
else
ret[0] = 'e';
ret[1] = 'A';
return ret;
}
तो, जैसा कि आप देख सकते हैं, होने से अधिक थ्रेड कि ताला लगा एक आपदा होगा किसी तरह का बिना .. का उपयोग, लेकिन यह कोई उद्देश्य से किया जा रहा फिर से प्रवेशी है। आपको लगता है कि में चलाने होगा जब गतिशील आबंटित स्मृति कुछ एम्बेडेड मंच पर वर्जित है।
पूरी तरह कार्यात्मक प्रोग्रामिंग में, रैत्रांत अक्सर धागा सुरक्षित संकेत नहीं करता है, यह, आदि समारोह प्रवेश बिंदु, प्रत्यावर्तन के लिए पारित परिभाषित या अनाम कार्यों के व्यवहार पर निर्भर करेगा
लिए एक बेहतर तरीका 'धागा सुरक्षित' डाल समवर्ती पहुँच है, जो बेहतर जरूरत दिखाता लिए सुरक्षित है।
रैत्रांत धागा सुरक्षित संकेत नहीं करता है। शुद्ध कार्य थ्रेड-सुरक्षा का संकेत देते हैं। –
ग्रेट उत्तर टिम। बस स्पष्ट करने के लिए, आपकी "अक्सर" से मेरी समझ यह है कि थ्रेड-सुरक्षित पुनर्वित्त का संकेत नहीं देता है, लेकिन पुनर्विक्रेता भी थ्रेड-सुरक्षित नहीं दर्शाता है। क्या आप एक पुनर्विक्रेता फ़ंक्शन का उदाहरण ढूंढ पाएंगे जो * थ्रेड-सुरक्षित नहीं है? – Riccardo
@ टिम पोस्ट "संक्षेप में, पुनर्विक्रेता का अर्थ अक्सर थ्रेड सुरक्षित होता है (जैसा कि" यदि आप थ्रेड का उपयोग कर रहे हैं तो उस फ़ंक्शन के पुनर्वित्त संस्करण का उपयोग करें "), लेकिन थ्रेड सुरक्षित हमेशा पुनः प्रवेश करने का मतलब नहीं है।" qt [कहते हैं] (http://qt-project.org/doc/qt-4.8/threads-reentrancy.html) विपरीत: "इसलिए, एक थ्रेड-सुरक्षित फ़ंक्शन हमेशा पुनर्वित्तक होता है, लेकिन एक पुनर्विक्रेता फ़ंक्शन हमेशा थ्रेड नहीं होता है- सुरक्षित। " – 4pie0