मैं लिनक्स एम्बेडेड सिस्टम पर चल रहे किसी सेवा (डेमन) द्वारा उपयोग किए जाने वाले कुछ हद तक पैरामीटर का नेटवर्क नियंत्रण जोड़ना चाहता हूं। प्रक्रिया कॉल की कोई आवश्यकता नहीं है, प्रत्येक पैरामीटर को बहुत ही प्राकृतिक तरीके से मतदान किया जा सकता है। साझा मेमोरी नेटवर्किंग कोड को डिमन से बाहर रखने का एक अच्छा तरीका प्रतीत होता है, और चर के सावधानीपूर्वक नियंत्रित सेट पर साझा पहुंच को सीमित करता है।क्या सी ++ 11 परमाणु <T> एमएमएपी के साथ प्रयोग योग्य है?
चूंकि मैं नहीं चाहता हूं कि आंशिक लिखने वाले मूल्यों की दृश्यता के कारण लिखने के लिए, मैं std::atomic<bool>
और std::atomic<int>
का उपयोग करने की सोच रहा था। हालांकि, मुझे चिंता है कि std::atomic<T>
को इस तरह कार्यान्वित किया जा सकता है कि केवल सी ++ 11 थ्रेड के साथ काम करता है और कई प्रक्रियाओं के साथ नहीं (संभावित रूप से, ओएस थ्रेड्स के साथ भी नहीं)। विशेष रूप से, यदि कार्यान्वयन साझा स्मृति ब्लॉक के बाहर संग्रहीत किसी भी डेटा संरचना का उपयोग करता है, तो बहु-प्रक्रिया परिदृश्य में यह असफल हो जाता है।
परमाणु अभिन्न विशेषज्ञताओं और विशेषज्ञता
atomic<bool>
मानक लेआउट होगा:मैं कुछ आवश्यकताओं जो होने के लिए सुझाव है कि देखते हैं कि
std::atomic
अतिरिक्त डेटा के लिए एक एम्बेडेड ताला वस्तु या सूचक पकड़ नहीं होगा। वे प्रत्येक के पास एक छोटा डिफ़ॉल्ट कन्स्ट्रक्टर और एक छोटा विनाशक होगा। वे प्रत्येक समग्र प्रारंभिक वाक्यविन्यास का समर्थन करेंगे।परमाणु वर्ग टेम्पलेट के सूचक आंशिक विशेषज्ञता होगी। इन विशेषज्ञताओं में मानक लेआउट, तुच्छ डिफ़ॉल्ट डिफॉल्ट कन्स्ट्रक्टर और छोटे विनाशक होंगे। वे प्रत्येक समग्र प्रारंभिक वाक्यविन्यास का समर्थन करेंगे।
तुच्छ डिफ़ॉल्ट निर्माण और विनाश मुझे लगता जुड़े करने के लिए बाहर निकालने के प्रति-वस्तु डेटा, चाहे वस्तु के अंदर संग्रहित, एक सूचक सदस्य चर के माध्यम से, या एक बाहरी मानचित्रण के माध्यम से।
हालांकि, मुझे ऐसा कुछ भी नहीं दिखाई देता है जो एक वैश्विक म्यूटेक्स/महत्वपूर्ण अनुभाग (या यहां तक कि एक वैश्विक संग्रह, का उपयोग करने से कार्यान्वयन को छोड़ देता है, जब तक संग्रह तत्व व्यक्तिगत परमाणु वस्तुओं से जुड़े नहीं होते - कुछ के साथ कुछ झूठे संघर्ष को कम करने के लिए एक कैश एसोसिएशन योजना का उपयोग किया जा सकता है)। जाहिर है, कई प्रक्रियाओं से पहुंच वैश्विक म्यूटेक्स का उपयोग करके कार्यान्वयन पर असफल हो जाएगी, क्योंकि उपयोगकर्ताओं के पास स्वतंत्र म्यूटेक्स होंगे और वास्तव में एक-दूसरे के साथ सिंक्रनाइज़ नहीं होंगे।
atomic<T>
का कार्यान्वयन उन चीजों को करने की अनुमति है जो अंतर-प्रक्रिया साझा स्मृति के साथ असंगत हैं, या ऐसे अन्य नियम हैं जो इसे सुरक्षित बनाते हैं?
मैं सिर्फ देखा है कि तुच्छ डिफ़ॉल्ट निर्माण एक नहीं के लिए तैयार स्थिति में वस्तु को छोड़ देता है, और atomic_init
के लिए एक कॉल की आवश्यकता है। और मानक ताले के प्रारंभिकरण का उल्लेख है। यदि ये ऑब्जेक्ट के अंदर संग्रहीत हैं (और गतिशील स्मृति आवंटन असंभव प्रतीत होता है, क्योंकि विनाशक तुच्छ रहता है) तो उन्हें प्रक्रियाओं के बीच साझा किया जाएगा। लेकिन मैं अभी भी वैश्विक म्यूटेक्स की संभावना के बारे में चिंतित हूं।
किसी भी मामले में, किसी साझा क्षेत्र में प्रत्येक चर के लिए atomic_init
पर एक कॉल की गारंटी करना मुश्किल लगता है ... इसलिए मुझे लगता है कि मुझे सी ++ 11 परमाणु प्रकारों से दूर जाना होगा।
एक परिशिष्ट के रूप में, (http://stackoverflow.com/questions/4668592/ipc-via-mmaped-file-should-atomics-and- [लोग साझा स्मृति के साथ परमाणु आपरेशन के उपयोग की सिफारिश की है] या अस्थिर-उपयोग किया जा सकता है), हालांकि यह स्पष्ट नहीं है कि क्या वे 'std :: परमाणु' को शामिल या बहिष्कृत करना चाहते हैं या अन्य API को काम करने की गारंटी है या नहीं। –
मैं उम्मीद करता हूं कि उचित प्रणाली 'परमाणु' चर के लिए बाह्य डेटा संरचनाओं का उपयोग नहीं करेगी; यह परमाणुओं के बिंदु को पहली जगह हार जाएगा ... – Mehrdad
@ मेहरदाद: मैं नहीं देखता कि वैश्विक लॉक लेने से स्थानीय लॉक लेने के अलावा उद्देश्य को हराने में मदद मिलेगी, और मानक विशेष रूप से लागू करने वाले कार्यान्वयन के बारे में बात करता है। –