2012-01-15 12 views
10

संभव डुप्लिकेट:
Malloc thread-safe?malloc() गैर-पुनर्वित्तक है लेकिन थ्रेड-सुरक्षित है?

मैं नहीं थोड़ा उलझन में जब मैं "लिनक्स प्रोग्रामिंग इंटरफ़ेस" पढ़ रहा हूँ कर रहा हूँ।

पुस्तक से यह कहता है कि मॉलोक गैर-पुनर्वित्तक है क्योंकि यह वैश्विक लिंक्ड सूची डेटा संरचना में हेरफेर करता है लेकिन म्यूटेक्स का उपयोग करके थ्रेड-सुरक्षित बना दिया जाता है।

मैं इसके बारे में थोड़ा उलझन में हूं: चूंकि यह म्यूटेक्स का उपयोग करने के साथ थ्रेड-सुरक्षित है और इस प्रकार एक ही समय में एक से अधिक धागे द्वारा बुलाया जा सकता है, यह एक पुनर्वित्त समारोह क्यों नहीं है? (अगर हम कहते हैं कि पुनर्वित्त का अर्थ है कि इसे एक ही समय में एक से अधिक कॉलर द्वारा बुलाया जा सकता है)

एक और सवाल यह है कि चूंकि मॉलोक थ्रेड-सुरक्षित है, क्या हम इसे सिग्नल हैंडलर में डाल सकते हैं? मुझे लगता है कि उत्तर हाँ है लेकिन मुझे यकीन नहीं है कि इस पुस्तक के अनुसार, यह कहता है कि सिग्नल हैंडलर में केवल एक पुनर्वित्तक या एसिंक-सिग्नल-सुरक्षित फ़ंक्शन लगाया जा सकता है।

क्या कोई मुझे यह समझा सकता है?

+0

क्या mutex malloc के कार्यान्वयन में शामिल है? – Bingo

उत्तर

23

अगर हम कहते हैं कि रैत्रांत इसका मतलब है कि यह एक ही समय

गलत में एक से अधिक कॉल करने वाले को लागू किया जा सकता है। पुनर्वित्त का अर्थ है आप इसे बाधित कर सकते हैं और पिछले अवतार से पहले इसे फिर से कॉल कर सकते हैं समाप्त हो गया। कल्पना कीजिए malloc इस तरह दिखता है:

lock(mutex); 

/* Stuff. */ 

unlock(mutex): 

अगर यह बीच में बाधा आती है, तो क्या होता है, को अनलॉक करने से पहले और किसी और malloc कॉल?

  • पहले संदर्भ जब तक दूसरा एक म्युटेक्स पर
  • दूसरा संदर्भ ब्लॉक किया जाता है जारी नहीं रख सकते और जब तक पहले म्युटेक्स

एक गतिरोध है कि बातें बताता जारी नहीं रख सकते।

एक और सवाल यह है कि चूंकि मॉलोक थ्रेड-सुरक्षित है, क्या हम इसे सिग्नल हैंडलर में डाल सकते हैं? मुझे लगता है कि जवाब हां

फिर से गलत है। उपरोक्त उदाहरण देखें। कल्पना करें कि मुख्य कार्यक्रम malloc कर रहा है और फ़ंक्शन वास्तव में समाप्त होने से पहले आपके हैंडलर मॉलोक को कॉल करता है।

+0

धन्यवाद cnicutar, जवाब बहुत स्पष्ट है !! – kai

+0

@ काई: ध्यान दें कि समस्या (इन अवधारणाओं को भ्रमित करने) इस तथ्य से उत्साहित है कि पॉज़िक्स (पूर्व -2008) के पुराने संस्करणों ने गलती से सुरक्षित शब्द का उपयोग किया है ... –

2

पुनर्वित्त और थ्रेड-सुरक्षा दो अलग-अलग अवधारणाएं हैं। एक पुनर्वित्त समारोह गैर-थ्रेड -साफ हो सकता है और थ्रेड-सुरक्षित फ़ंक्शन गैर-पुनर्विक्रेता हो सकता है।

सी में लाइब्रेरी फ़ंक्शंस को पुनर्विक्रेता होने की गारंटी नहीं है और सिग्नल हैंडलर से केवल पुनर्वित्त कार्यों को ही बुलाया जा सकता है।

+0

'एक पुनर्वित्त समारोह गैर- थ्रेड-सुरक्षित '... क्या यह हो सकता है? –

+4

@ यूलियक्स: हाँ। कुछ मशीनों पर, स्थैतिक चर स्टैक-आधारित स्थानीय चर से तेज होते हैं। कोड जो प्रविष्टि पर स्टैक पर अपने स्थैतिक चर की प्रतिलिपि बनाता है, स्थिर चर का उपयोग करता है, और फिर स्टैक से चर को पुनर्स्थापित करता है फिर से प्रवेश किया जाएगा लेकिन थ्रेड-सुरक्षित नहीं होगा। – supercat

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