यह इस बात पर निर्भर करता है कि m_cur को कैसे संशोधित किया जा रहा है। यदि यह m_cur--;
जैसे सामान्य असाइनमेंट स्टेटमेंट का उपयोग कर रहा है, तो इसे अस्थिर होने की आवश्यकता है। हालांकि, अगर इसे Interlocked परिचालनों में से किसी एक का उपयोग करके संशोधित किया जा रहा है, तो ऐसा इसलिए नहीं है क्योंकि इंटरलॉक की विधियां स्वचालित रूप से मेमोरी बाधा डालती हैं ताकि यह सुनिश्चित किया जा सके कि सभी धागे ज्ञापन प्राप्त करें।
सामान्य रूप से, थ्रेड में साझा किए गए परमाणु मूल्य को संशोधित करने के लिए इंटरलाक्ड का उपयोग करना बेहतर विकल्प है। न केवल यह आपके लिए मेमोरी बाधा का ख्याल रखता है, बल्कि यह अन्य सिंक्रनाइज़ेशन विकल्पों की तुलना में थोड़ा तेज होता है।
उसने कहा, जैसे कि अन्य ने कहा है कि मतदान लूप भारी रूप से अपर्याप्त हैं। थ्रेड को रोकने के लिए बेहतर होगा जो इंतजार करने की ज़रूरत है, और जो कोई भी m_cur को संशोधित कर रहा है उसे समय आने पर इसे जागने का प्रभार लेना चाहिए। Monitor.Wait() and Monitor.Pulse() और AutoResetEvent दोनों आपकी विशिष्ट आवश्यकताओं के आधार पर कार्य के लिए उपयुक्त हो सकते हैं।
स्रोत
2012-04-25 00:59:52
एक संपत्ति को int बनाओ और सेटर विधि में थ्रेड, (autoResetEvent, शायद) को सिग्नल करें। समस्या बाईपास, सीपीयू उपयोग कम, अस्थिर संदेह हटा दिया। –
यह कुछ दुर्लभ मामलों को छोड़कर आम तौर पर एक बुरा विचार है; क्या आपको पता चलेगा कि कितने माइक्रोसॉन्ड अधिकतम आप स्पिन करने की उम्मीद करते हैं? –
सीपीयू-लूपिंग किसी अन्य थ्रेड द्वारा लिखे गए 'cur' को पढ़ने के दौरान, अगर थ्रेड थ्रेड नहीं चल रहा है तो मतदान थ्रेड नहीं चल रहा है जब सेटर थ्रेड एक सीमा-सीमा मान लिखता है। अगर इसे अधिभारित बॉक्स पर छूट दी गई है, तो उसे आउट-ऑफ-रेंज क्यू का पता लगाने से पहले औसत आधा-क्वांटम का इंतजार करना होगा।यदि कर्सर फिर से नहीं चल रहा है, तो कर्सर फिर से रेंज में वापस आ जाता है, तो यह बिल्कुल बाहर की स्थिति का पता नहीं लगाएगा। –