PTHREAD_MUTEX_INITIALIZER बनाम pthread_mutex_init (और म्यूटेक्स, परम)


90

क्या इसमें कोई अंतर है

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

या

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

क्या मैं पर्याप्त सुरक्षित हूं अगर मैं केवल पहली विधि का उपयोग करूं?

नोट: मेरा प्रश्न ज्यादातर बहुत छोटे कार्यक्रमों को संदर्भित करता है जहां सबसे अधिक मैं जो कुछ भी करता हूं वह कई क्लाइंट्स को सर्वर से कनेक्ट करता है और कार्यकर्ता थ्रेड्स के साथ उनकी पूछताछ को हल करता है।

जवाबों:


74

POSIX मानक के पुराने संस्करणों द्वारा एक आरंभिक के साथ पहला तरीका केवल वैधानिक रूप से आवंटित चर के साथ काम करने की गारंटी है, न कि जब चर एक autoचर है जिसे फ़ंक्शन बॉडी में परिभाषित किया गया है। हालाँकि मैंने कभी ऐसा प्लेटफ़ॉर्म नहीं देखा है जहाँ इसे autoचर के लिए भी अनुमति नहीं दी जाएगी , और इस प्रतिबंध को POSIX मानक के नवीनतम संस्करण में हटा दिया गया है।

staticके बाद से यह बूटस्ट्रैप कोड बहुत आसान लिखने के लिए अनुमति देता है संस्करण है, वास्तव में यदि आप कर सकते हैं बेहतर है। जब भी रन टाइम में आप ऐसे म्यूटेक्स का उपयोग करने वाले कोड में प्रवेश करते हैं, तो आपको आश्वस्त किया जा सकता है कि म्यूटेक्स को आरंभीकृत किया गया है। बहु सूत्रण संदर्भ में यह एक अनमोल जानकारी है।

जब आप अपने म्यूटेक्स के लिए विशेष गुणों की आवश्यकता होती है, जैसे कि पुनरावर्ती उदाहरण या प्रक्रियाओं के बीच ही नहीं, थ्रेड्स के बीच साझा करने योग्य होने के लिए एक init फ़ंक्शन का उपयोग करने का तरीका बेहतर है।


8

आप म्यूटेक्स की अधिक विशेषताओं को डायनामिक इनिशियलाइज़ेशन के साथ सेट कर सकते हैं, साथ ही आप डायनेमिक विधि का उपयोग केवल तभी कर सकते हैं जब आप रन टाइम में म्यूटेक्स का एक गुच्छा जोड़ रहे हों।

स्थैतिक दृष्टिकोण के साथ कुछ भी गलत नहीं है, अगर यह आपकी आवश्यकताओं के अनुरूप है।


" प्लस आप केवल गतिशील विधि का उपयोग कर सकते हैं यदि आप रन समय में म्यूटेक्स का एक गुच्छा जोड़ रहे हैं। " तो, इसका क्या मतलब है? एक छोटा सा उदाहरण अगर यह स्पष्ट करना आसान नहीं है?
कालिक

1
@ कालिक: यदि आपका म्यूटेक्स द्वारा आवंटित किया गया है malloc()(या आवंटित ऑब्जेक्ट के अंतर्गत आता है)।
माइकल बूर

3
@Kalec यदि म्यूटेक्स चर "लॉक" एक संरचना का हिस्सा है, तो हम 1 दृष्टिकोण का पालन नहीं कर सकते हैं। हमें pthread_init () का उपयोग करना होगा।
पंकज कुशवाहा

8

मैं इसे इस पुस्तक से उद्धृत करना चाहूंगा :

POSIXथ्रेड्स के साथ , ताले को इनिशियलाइज़ करने के दो तरीके हैं। इसे करने का एक तरीका इस PTHREAD_MUTEX_INITIALIZERप्रकार है: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

ऐसा करने से लॉक डिफ़ॉल्ट मानों पर सेट हो जाता है और इस तरह लॉक को प्रयोग करने योग्य बनाया जाता है। इसे करने का डायनेमिक तरीका (यानी, रन टाइम में) pthread_mutex_init()इस प्रकार कॉल करना है: int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

इस दिनचर्या के लिए पहला तर्क लॉक का पता है, जबकि दूसरा विशेषताओं का एक वैकल्पिक सेट है। विशेषताओं के बारे में और पढ़ें; बस में NULL गुजरना चूक का उपयोग करता है। किसी भी तरह से काम करता है , लेकिन हम आम तौर पर गतिशील (उत्तरार्द्ध) विधि का उपयोग करते हैं।


5

ऐसे मामलों में जहां डिफ़ॉल्ट म्यूटेक्स विशेषताएँ उपयुक्त हैं, म्यूट PxREAD_MUTEX_INITIALIZER का उपयोग म्यूटेक्स को आरंभ करने के लिए किया जा सकता है।

यदि आप म्यूटेक्स के लिए विशेषताओं को निर्दिष्ट करना चाहते हैं तो डायनामिक इनिशियलाइज़ेशन के साथ ........

यह प्रभाव NULL के रूप में पैरामीटर attrspecified के साथ pthread_mutex_init () को कॉल करके डायनामिक आरंभीकरण के बराबर होगा, सिवाय इसके कि कोई त्रुटि जाँच नहीं की जाती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.