मेरे पास एक अभिभावक और कार्यकर्ता धागा है जो एक बूल ध्वज और एक std :: वेक्टर साझा करता है। माता-पिता केवल पढ़ता है (यानी, बूल पढ़ता है या my_vector.empty() को कॉल करता है); कार्यकर्ता केवल लिखता है।एक पाठक। एक लेखक म्यूटेक्स और परमाणु-निर्मित के बारे में कुछ सामान्य प्रश्न
मेरे सवालों का:
मैं bool ध्वज की रक्षा म्युटेक्स की जरूरत है?
क्या मैं कह सकता हूं कि सभी बूल पढ़ने/लिखने स्वाभाविक रूप से परमाणु संचालन हैं? यदि आप हां या नहीं कहते हैं, तो आपको अपनी जानकारी कहां से मिली?
मैंने हाल ही में GCC Atomic-builtin के बारे में सुना है। क्या मैं म्यूटक्स का उपयोग किए बिना अपने ध्वज को परमाणु पढ़ने/लिखने के लिए इनका उपयोग कर सकता हूं? अंतर क्या है? मैं समझता हूं कि परमाणु बिल्टिन मशीन कोड पर उबालते हैं, लेकिन म्यूटेक्स भी सीपीयू के मेमोरी बाधा निर्देशों को उबालते हैं? लोग म्यूटेक्स को "ओएस-स्तरीय" निर्माण क्यों कहते हैं?
क्या मुझे अपने std :: vector की रक्षा करने के लिए mutex की आवश्यकता है? याद रखें कि कार्यकर्ता धागा इस वेक्टर को पॉप्युलेट करता है, जबकि माता-पिता केवल उस पर खाली() कहते हैं (यानी, केवल इसे पढ़ता है)
मुझे विश्वास नहीं है कि बूल या वेक्टर के लिए म्यूटेक्स सुरक्षा आवश्यक है। मैं निम्नानुसार तर्कसंगत हूं, "ठीक है, अगर मैंने अद्यतन स्मृति को अपडेट करने से ठीक पहले पढ़ा है .. यह अभी भी ठीक है, मुझे अगली बार अद्यतन मूल्य मिलेगा। अधिक महत्वपूर्ण बात यह है कि मुझे नहीं पता कि लेखक को क्यों अवरुद्ध किया जाना चाहिए पढ़ना पढ़ रहा है, क्योंकि बाद में, पाठक केवल पढ़ रहा है! "
अगर कोई मुझे सही दिशा में इंगित कर सकता है, तो यह बहुत अच्छा होगा। मैं जीसीसी 4.3, और इंटेल x86 32-बिट पर हूं। बहुत बहुत धन्यवाद!
के साथ 'bool' के संबंध में, वह निश्चित रूप से यह सुनिश्चित करने के लिए उपयोग वास्तव में तब होता है जब वह सोचता है कि यह करता है कुछ की जरूरत है। यदि उसके पास एक कंपाइलर है जो 'std :: परमाणु <>' का समर्थन करता है, तो वह पर्याप्त होना चाहिए; अन्यथा, उसे किसी भी प्रकार की सिंक्रनाइज़ेशन तंत्र की आवश्यकता होती है, या यह सुनिश्चित करने के कुछ अन्य साधन हैं कि आवश्यक बाड़, आदि मौजूद हैं। –
भी ध्यान रखें कि 'std :: vector' अपने पैरों के नीचे से उसकी सामग्री को स्थानांतरित हो सकता है जब यह बड़ा बफर के लिए फिर से आवंटित करने के लिए की जरूरत है। इस बिंदु पर उपभोक्ता 'हटाएं'-एड मेमोरी पढ़ रहा हो सकता है। –
@Maxim: मैं एक स्पष्टीकरण कृपया की जरूरत है, bools पर इंटेल के मैनुअल संचालन के अनुसार स्वाभाविक परमाणु हैं, फिर भी आप अपनी पहली जबाब है कि "एक परमाणु अनुदेश करना होगा" में कहते हैं। क्या आप विरोधाभास कर रहे हैं? या, क्या आप कह रहे हैं कि मुझे सुरक्षित पक्ष पर होना चाहिए और एक परमाणु निर्मित का उपयोग करना चाहिए, मेरा कोड कभी भी गैर-इंटेल सिस्टम पर चलता है? – Kostolma