2011-01-07 16 views
9

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

कारण मैं ऐसा करना चाहता हूं कि कई धागे पर चल रहे ऑब्जेक्ट्स की एक सुसंगत स्थिति एकत्र करना है। हालांकि, उनके कोड को बदला नहीं जा सकता है (वे पहले ही संकलित हैं), इसलिए मैं इसमें म्यूटेक्स, सेमफोर इत्यादि नहीं डाल सकता। परमाणु संचालन निश्चित रूप से राज्य संग्रह (यानी कुछ चर की प्रतिलिपि बनाना) है।

+1

आप क्या हासिल करने की कोशिश कर रहे हैं? अन्य सभी धागे को निलंबित करना चीजों के बारे में जाने का एक खतरनाक तरीका है और आप एक डेडलॉक के साथ समाप्त हो सकते हैं जहां आपका जागृत धागा कुछ करने की कोशिश करता है और निलंबित धागे में से एक को किसी प्रकार का ताला लगाया जाता है, जिसे कभी भी रिलीज़ नहीं किया जा सकता है। –

+0

मैंने इस संदर्भ में परमाणु शब्द कभी नहीं सुना है। मैं केवल एसीआईडी, लेनदेन की परिभाषा के हिस्से के रूप में इसे जानता हूं। वैसे, आपको इसकी आवश्यकता क्यों है? –

+0

व्यक्तिगत आईएल ऑपरेशंस परमाणु हैं। बहुत कम वर्ग हैं (एक इंटरलाक्ड है) जो परमाणु संचालन का समर्थन करता है। इसके अलावा, नहीं। और मुझे बिंदु नहीं दिख रहा है। – Amy

उत्तर

4

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

मैं यह सुनिश्चित करने के लिए सावधानीपूर्वक लॉकिंग का उपयोग करने की सलाह दूंगा कि संदर्भ में परिवर्तन होने पर भी आपका कोड काम करेगा।

1

ठीक है, आप locks का उपयोग कर सकते हैं, लेकिन आप संदर्भ स्विचिंग को बिल्कुल रोक नहीं सकते हैं। लेकिन यदि आपके थ्रेड एक ही ऑब्जेक्ट पर लॉक करते हैं, तो स्पष्ट रूप से प्रतीक्षा करने वाले थ्रेड नहीं चलेंगे, इसलिए कोई संदर्भ स्विचिंग नहीं है क्योंकि चलाने के लिए कुछ भी नहीं है।

आप this page पर भी देखना चाहते हैं।

+0

लॉक जरूरी नहीं है "किसी भी संदर्भ के बिना किसी भी प्रक्रिया पर किसी अन्य थ्रेड पर स्विचिंग के बिना" –

+0

हाँ, मुझे एहसास हुआ कि बाद में; थोड़ा बदलाव किया, लेकिन मुझे लगता है कि यह अभी भी सवाल का जवाब नहीं देता है। – Mehrdad

-1

नहीं। आप इसे थ्रेड-सुरक्षित बनाने के लिए मॉनिटर के साथ कोड के ब्लॉक को घेर सकते हैं, लेकिन आप सामान्य कोड स्निपेट परमाणु नहीं बना सकते हैं।

object lck = new object(); 

lock(lck) 
{ 
    // thread safe code goes in here 

} 
+0

यह क्यों कम किया जा रहा है? क्या मेरा जवाब किसी भी तरह गलत है? – Amy

+0

@ yodaj007: यह मुझे नीचे नहीं था, लेकिन मुझे लगता है कि क्यों: आपका कोड (यदि अंधाधुंध नकल और चिपकाया जाता है) हर बार चलाए जाने पर एक नई वस्तु बना देगा और इसलिए वास्तव में कुछ भी सिंक्रनाइज़ नहीं करेगा। –

+0

उह। हां, यह सच है, जिस तरह से मैंने इसे टाइप किया। हालांकि यह अंधाधुंध प्रतिलिपि/चिपकाया नहीं गया था। मैंने इसे नोटपैड ++ में टाइप किया। – Amy

0

नहीं, यह बहु-कार्य करने के खिलाफ है।

जब तक कि बढ़ने जैसे बहुत ही सरल संचालन न हो ... जो आपके प्रश्न का विषय नहीं हैं।

+1

किसी संख्या को बढ़ाने पर परमाणु नहीं है जब तक आप इंटरलाक्ड क्लास के बारे में बात नहीं कर रहे हों। वांछित अगर मैं इसे प्रदर्शित करने के लिए कोड प्रदान कर सकते हैं; एसओ पर एक सवाल करें और मैं इसका जवाब दूंगा। – Amy

+0

मैंने आम तौर पर बात की, और यह सरल संचालन 'इंटरलाक्ड। इंस्ट्रूमेंट()' और कुछ और की तरह हैं। – Xaqron

0

परमाणु एक पाठक/बहु लेखक रजिस्टरों के संग्रह (सरणी) से बना साझा साझा स्मृति से वैश्विक स्थिति प्राप्त करना संभव है। समाधान सरल है लेकिन तुच्छ नहीं है। आप "साझा स्मृति के परमाणु स्नैपशॉट्स" पेपर में प्रकाशित एल्गोरिदम पढ़ सकते हैं या आप मल्टीप्रोसेसर प्रोग्रामिंग पुस्तक की कला से अध्याय 4 पढ़ सकते हैं, वहां आप जावा भाषा पर कार्यान्वयन पर विचार प्राप्त कर सकते हैं, बेशक, एक बार जब आप हों इस विचार से परिचित है कि आप इसे किसी अन्य भाषा में ले जाने में सक्षम होना चाहिए। क्षमा करें अगर मेरी अंग्रेजी पर्याप्त नहीं है।

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