2009-07-23 9 views
7
class StopIt 
{ 
    private bool stop; 

    void Loop() 
    { 
    while (!stop) 
    { 
     // work 
    } 
    } 

    void Stop() 
    { 
    stop = true; 
    } 
} 

असल में, यदि लूप विधि एक थ्रेड में चल रही है और स्टॉप को दूसरे से बुलाया जाता है तो ऑपरेशन ठीक से बंद हो जाएगा? मैं समझता हूं कि बूल पढ़ने/लिखना परमाणु है। लेकिन, क्या यह पर्याप्त है? अगर थ्रेड लूप तुरंत बंद नहीं होता है तो परेशानी होती है। क्या मुझे अस्थिर रोकना चाहिए?एक परमाणु ऑपरेशन पर्याप्त है

+0

मेरा नियम: यदि आपको पता नहीं है कि वास्तव में क्या अस्थिर साधन है, तो आपको लॉक मुक्त प्रोग्राम लिखने का प्रयास नहीं करना चाहिए। चूंकि आप सवाल पूछ रहे हैं, आप नहीं जानते कि इसका क्या अर्थ है। तो लॉक-फ्री प्रोग्राम लिखने का प्रयास न करें। सुरक्षित रहना। एक ताला का प्रयोग करें। जब दुर्घटनाग्रस्त हो तो ताले महंगे होते हैं; इसे लॉक-फ्री बनाने की कोशिश न करें जब तक आप निश्चित न हों कि (1) आपके पास एक प्रदर्शन समस्या है (2) लॉक समस्या का कारण है और (3) आप समझते हैं कि प्रोसेसर हार्डवेयर स्तर पर अस्थिर अर्थ क्या है। –

+0

स्टॉप का उपयोग होने पर लॉक का उपयोग नहीं करना चाहिए? यदि ऐसा है, तो मैं थोड़ी देर लूप में पढ़ने की पहुंच कैसे लॉक करूं? –

+1

@yummy: जैसा कि यह अब दिखता है, इसे पढ़ने पर लॉक करना मुश्किल है, क्योंकि आप सीधे अपने लूप में फ़ील्ड तक पहुंच सकते हैं। यदि आप संपत्ति (या एक विधि) में पढ़ते हैं, तो आप मूल्य पढ़ने के लिए लॉक का उपयोग कर सकते हैं। –

उत्तर

10

हां, आपको निश्चित रूप से अस्थिर के रूप में stop चिह्नित करना चाहिए।

परमाणुता पर्याप्त नहीं है - यह गारंटी नहीं देता है कि एक धागा किसी अन्य द्वारा किए गए परिवर्तनों को "देख" देगा।

जबकि volatile की मेरी समझ वर्तमान में कुछ सर्जरी से गुजर रहा है, आप कर सकते हैं मोटे तौर पर के रूप में एक अस्थिर चर करने के लिए एक लिखने की लगता है कि "यकीन है कि अन्य लोगों को इस तुरंत देख सकते हैं बनाने!" और एक अस्थिर चर से पढ़ने के रूप में "मैं नवीनतम मूल्य देखना चाहता हूँ!"

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

वास्तव में, यदि "काम" कभी एक गैर inlined विधि बुला शामिल है, मेरा मानना ​​है कि JIT वर्तमान में एक अस्थिर वैसे भी पढ़ ऐसा करने के लिए मजबूर किया जाता है, लेकिन वह सिर्फ एक मौजूदा व्यावहारिक सीमा है ... सिद्धांत आप कहते हैं इसे अस्थिर बनाना चाहिए।

+0

एक थ्रेड कैसे दूसरे में हो सकता है? – KdgDev

+0

इसके विपरीत भी सच है: अस्थिरता परमाणुता के लिए पर्याप्त नहीं है! – Noldorin

+0

@ नोल्डोरिन: इस मामले में अप्रासंगिक, जैसा कि बुलियन * के लिए लिखना * ईसीएमए 335 विभाजन 1 की धारा 12.6.6 के आधार पर परमाणु होगा। –

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