2012-09-16 35 views
5

मैं जानना चाहता हूं कि सिग्नल हैंडलर से साझा डेटा तक पहुंचना एक अच्छा विचार है या नहीं। मेरा मतलब है कि एक प्रक्रिया के साथ बहु प्रक्रिया प्रणाली और बहुप्रचारित प्रणाली के परिदृश्य पर विचार करें। बहु प्रक्रिया प्रणाली में, मान लें कि मेरे पास प्रक्रियाएं एक विशेष सिग्नल को संभालती हैं और प्रक्रियाओं द्वारा कुछ साझा चर या स्मृति को अद्यतन करती हैं। क्या मैं सिग्नल हैंडलर से ही ऐसा कर सकता हूं।सिग्नल हैंडलर से साझा डेटा तक पहुंच

हालांकि, pthreads का उपयोग कर धागे के मामले में, मुझे नहीं लगता कि यह संभव है है। http://maxim.int.ru/bookshelf/PthreadsProgram/htm/r_40.html। जैसा कि इस आलेख में दिया गया है, उन्होंने उल्लेख किया है कि यह असीमित सिग्नल सुरक्षित नहीं है और इसके लिए सिग्वाइट का उपयोग करने का सुझाव दिया है। मैं नहीं हूं कि यह असीमित सिग्नल सुरक्षित क्यों नहीं है। मेरा मतलब है कि कहें, मैं थ्रेड द्वारा सिग्नल को संभालता हूं और सिग्नल हैंडलर रूटिंग में है। मैं इसे अद्यतन करने के लिए साझा स्मृति पर एक ताला हासिल करता हूं। इस बीच एक ही प्रकार का एक और सिग्नल आता है और इसे संभालने के लिए ज़िम्मेदार एक और थ्रेड सिग्नल हैंडलर को फिर से निष्पादित करता है। यहां सिग्नल हैंडलर प्रक्रिया के लिए समान है लेकिन इसे कई बार कहा जाता है। दूसरी बार, यह लॉक और अपडेट/डेटा को ओवरराइड नहीं देख सकता है। क्या साझा डेटा का उपयोग करके मल्टीथ्रेड सिग्नल हैंडलर के साथ यह समस्या है।

मैं थोड़ा उलझन में, बहु प्रक्रिया प्रणालियों में हूँ, मैं प्रत्येक प्रक्रिया के लिए संकेत हैंडलर की एक प्रति है। लेकिन बहुप्रचारित प्रणाली में, एकाधिक धागे द्वारा उपयोग किए जाने वाले सिग्नल हैंडलर की एक प्रति है, यह नहीं है। तो जब एक ही प्रकार के कई सिग्नल आते हैं और हमारे पास दो धागे होते हैं जो इसे संभालने के लिए ज़िम्मेदार होते हैं, तो वे दोनों हैंडलर कोड के उसी टुकड़े को निष्पादित करने का प्रयास करेंगे? यह सब कैसे फिट बैठता है?

उत्तर

4

मैं लेख है कि आप संदर्भ के माध्यम से पढ़ सकते हैं और "सिग्नल हैंडलर में धागे" खंड में कुछ रोचक जानकारी नहीं मिली। उस खंड में, आप देखेंगे कि उनके पास पॉज़िक्स फ़ंक्शन कॉल की एक सूची है जिसे सिग्नल हैंडलर के भीतर से बनाया जा सकता है। फिर जल्द ही उस सूची के बाद, वे निम्नलिखित का उल्लेख करते हैं:

लेकिन पर्थ्रेड कहां कहां हैं? वे इनमें से किसी भी सूचियों में से नहीं हैं! वास्तव में, Pthreads मानक निर्दिष्ट करता है कि का व्यवहार सभी Pthreads फ़ंक्शंस को अपरिभाषित किया जाता है जब फ़ंक्शन को सिग्नल हैंडलर से कॉल किया जाता है। यदि आपके हैंडलर को डेटा को हेरफेर करने की आवश्यकता है, तो अन्य थ्रेड्सबफर्स, झंडे या राज्य चर के साथ साझा किया गया है, यह भाग्य से बाहर है। Pthreads mutex और हालत परिवर्तनीय सिंक्रनाइज़ेशन कॉल सीमाएं बंद हैं।

सूचना अंतिम वाक्य:

ऊपर उल्लिखित कार्यों कि एक संकेत हैंडलर से कहा जा सकता है के रूप में वर्णित किया गया है "pthreads म्युटेक्स और हालत चर तुल्यकालन कॉल सीमा बंद कर रहे हैं" इस प्रकार है:

इन कार्यों में एक विशेष संपत्ति होती है जिसे पुनर्वितरण कहा जाता है कि एक प्रक्रिया को प्रगति पर एक ही समय में इन कार्यों को एकाधिक कॉल करने की अनुमति देता है।

pthread तुल्यकालन कार्यों न विशेष संपत्ति reentrancy रूप में जाना जाता है, इसलिए मुझे लगता है कि (उदाहरण के लिए pthread_mutex_lock()) इन कार्यों एक पहुंचने संकेत से बाधित कर रहे हैं, तो व्यवहार नहीं "सुरक्षित" है।

कल्पना कीजिए कि आपका एप्लिकेशन pthread_mutex_lock(&theMutex) पर कॉल करता है और ठीक उसी क्षण (यानी, pthread_mutex_lock() फ़ंक्शन में) एक सिग्नल आता है।अगर सिग्नल हैंडलर pthread_mutex_lock(&theMutex) पर भी कॉल करता है, तो पिछली पथ्रेड कॉल समाप्त नहीं हो सकती है, इसलिए यह गारंटी नहीं दी जा सकती है कि pthread_mutex_lock() को कॉल लॉक मिलेगा। तो परिणामी व्यवहार अपरिभाषित/अनिश्चितवादी होगा।

मुझे लगता है कि किसी विशेष थ्रेड से sigwait() को कॉल करने की गारंटी होगी कि कोई महत्वपूर्ण नहीं, non-reentrancy फ़ंक्शन कॉल बाधित हो सकती हैं, इस प्रकार पाथ्रेड सिंक्रनाइज़ेशन फ़ंक्शंस को "सुरक्षित" होने की अनुमति मिलती है।

+1

आप 'pthread_mutex_lock के मानक मामला कैसे कल्पना कर सकते हैं()' काम एक से अधिक थ्रेड द्वारा एक ही समय में बुलाया जा रहा है? :) (उपयोग के इस मामले को देखते हुए यही कारण है कि हम mutexes है, कि है, ख़ाली यहाँ स्पष्टीकरण के लिए भीख माँगता, लगता है) – mlvljr

+1

@mlvljr: यह अलग है - संकेतों के साथ, यह * एक ही * धागा पर बुला 'pthread_mutex_lock' दो बार हो सकता है एक ही समय (अच्छी तरह से एक ही समय में नहीं, लेकिन सिग्नल हैंडलर में एक और शुरू होने पर एक कॉल आंशिक रूप से चलाया जाता है)। –

+1

इसके अलावा, अगर थ्रेड * पहले से ही * म्यूटेक्स का मालिक होता है जब एक सिग्नल प्राप्त होता है जिससे यह म्यूटेक्स (रिकर्सिव म्यूटेक्स को छोड़कर) प्राप्त करने का प्रयास करता है। –