Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C/C++ में रीएंट्रेंट फ़ंक्शन क्या है?

रीएंट्रेंट फ़ंक्शन की परिभाषा

एक फ़ंक्शन को रीएंट्रेंट फ़ंक्शन कहा जाता है यदि उस फ़ंक्शन को एक्जीक्यूशन के दौरान इंटरप्ट करने का प्रावधान है, फिर ISR (इंटरप्ट सर्विस रूटीन) को सर्विस करें, और फिर टास्क को रिज्यूम करें। इस प्रकार के फ़ंक्शन्स का उपयोग विभिन्न मामलों में किया जाता है जैसे रिकर्सन, हार्डवेयर इंटरप्ट हैंडलिंग।

रीएंट्रेंट फ़ंक्शन के गुण

  • कोई ग्लोबल या स्टेटिक वेरिएबल्स नहीं: कोई प्रतिबंध नहीं, लेकिन आमतौर पर सलाह नहीं दी जाती। क्योंकि इंटरप्ट ग्लोबल वेरिएबल के मान बदल सकता है, इसलिए ISR से वापस आने पर फ़ंक्शन को कुछ नया मान मिल सकता है, और परिणाम अलग होंगे
  • अपना कोड संशोधित नहीं करता: फ़ंक्शन की क्रिया पूरे कोड में समान रहनी चाहिए
  • कोई नॉन-रीएंट्रेंट फ़ंक्शन कॉल नहीं करता: एक रीएंट्रेंट फ़ंक्शन को किसी अन्य नॉन-रीएंट्रेंट फ़ंक्शन को कॉल नहीं करना चाहिए

उदाहरण: नॉन-रीएंट्रेंट फ़ंक्शन्स

int x;  // ग्लोबल वेरिएबल

int my_function() {
    return x * 10;  // ग्लोबल वेरिएबल उपयोग करता है - नॉन-रीएंट्रेंट
}

int my_second_function() {
    return my_function() * 20;  // नॉन-रीएंट्रेंट फ़ंक्शन कॉल करता है - नॉन-रीएंट्रेंट
}

उदाहरण: रीएंट्रेंट फ़ंक्शन्स

int my_function(int x) {  // पैरामीटर द्वारा डेटा प्राप्त करता है
    return x * 10;
}

int my_second_function(int x) {
    return my_function(x) * 20;  // केवल रीएंट्रेंट फ़ंक्शन कॉल करता है
}

अब ये दोनों फ़ंक्शन्स रीएंट्रेंट फ़ंक्शन्स हैं।

रीएंट्रेंसी vs थ्रेड सेफ्टी

स्वाभाविक रूप से रीएंट्रेंट
पहलूरीएंट्रेंसीथ्रेड सेफ्टी
चिंताकंट्रोल फ्लो इंटरप्शन (ISR, सिग्नल, रिकर्सन)समवर्ती एक्सेस (मल्टीपल थ्रेड्स)
मुख्य आवश्यकताशेयर्ड स्टेट नहीं (या सावधानीपूर्वक प्रबंधित)सिंक्रोनाइज़ेशन (म्यूटेक्स, एटॉमिक्स)
रिकर्सनअलग चिंता
सिग्नल हैंडलर्सकेवल एसिंक-सिग्नल-सेफ फ़ंक्शन्स कॉल कर सकते हैंलागू नहीं

एसिंक-सिग्नल-सेफ फ़ंक्शन्स (POSIX)

सिग्नल हैंडलर्स में केवल इन फ़ंक्शन्स को कॉल किया जा सकता है (आंशिक सूची):

  • _exit, write, read, close
  • sigaction, sigprocmask, sigemptyset
  • fork, exec परिवार
  • नहीं: malloc, free, printf, pthread_*, अधिकांश लाइब्रेरी फ़ंक्शन्स

रीएंट्रेंट फ़ंक्शन लिखने के दिशानिर्देश

  1. सभी डेटा को पैरामीटर्स के रूप में पास करें (ग्लोबल/स्टेटिक से बचें)
  2. मैलोक/फ्री से बचें (या थ्रेड-सेफ एलोकेटर का उपयोग करें)
  3. केवल रीएंट्रेंट लाइब्रेरी फ़ंक्शन्स कॉल करें
  4. थ्रेड-लोकल स्टोरेज (thread_local) का उपयोग करें यदि प्रति-थ्रेड स्टेट आवश्यक हो
  5. पैरामीटर्स के लिए const सहीता का उपयोग करें

रीएंट्रेंट स्ट्रिंग फ़ंक्शन उदाहरण (POSIX)

// नॉन-रीएंट्रेंट: स्टेटिक बफर उपयोग करता है
char* strtok(char* str, const char* delim);

// रीएंट्रेंट वर्जन: उपयोगकर्ता-प्रदत्त बफर
char* strtok_r(char* str, const char* delim, char** saveptr);

// उपयोग:
char str[] = "a,b,c";
char* saveptr;
char* token = strtok_r(str, ",", &saveptr);
while (token) {
    printf("%s\n", token);
    token = strtok_r(NULL, ",", &saveptr);
}
  1. - C/C++ में फंक्शन्स (3.5)

    फंक्शन्स एक मशीन की तरह होते हैं क्योंकि वे कुछ कार्यक्षमता करते हैं और किसी प्रकार का परिणाम उत्पन्न करते हैं। जैसे, मशीन कुछ इनपुट लेती है, उस इनपुट को प्रोसेस करती है और एक आउटपुट उत्पन्न करती है, इसी तरह फंक्शन कुछ वैल्यू लेता है, उन वैल्यू पर ऑपरेट करता है और आउटपुट उत्पन्न करता है। मैन्युअल रू

  1. - C/C++ में putwchar() फंक्शन

    इस लेख में हम C++ STL में putwchar() फंक्शन के कार्य, सिंटैक्स और उदाहरणों पर चर्चा करेंगे। putwchar() क्या है? putwchar() फंक्शन C++ STL में एक इनबिल्ट फंक्शन है, जो हेडर फाइल में परिभाषित है। putwchar() फंक्शन का उपयोग स्टैंडर्ड आउटपुट डिवाइस पर वाइड कैरेक्टर लिखने के लिए किया जाता है। यह फंक्शन

  1. C/C++ में System() फंक्शन C/C++ में System() फंक्शन

    दिया गया कार्य C/C++ में system() के कार्य को दिखाना है। system() फंक्शन C/C++ स्टैंडर्ड लाइब्रेरी का एक हिस्सा है। इसका उपयोग उन कमांड्स को पास करने के लिए किया जाता है जिन्हें ऑपरेटिंग सिस्टम के कमांड प्रोसेसर या टर्मिनल में निष्पादित किया जा सकता है, और अंत में कमांड के पूरा होने के बाद लौटाता है