2010-07-13 12 views
6

देखो:एकाधिक थ्रेड - क्या मुझे डेटा पढ़ने पर लॉक करने की आवश्यकता है? इस कोड में

int data=5; 

void Thread1() 
{ 
    if(data==5) 
    { 
     //nothing 
    } 
} 

void Thread2() 
{ 
    if(data==2) 
    { 
     //nothing 
    } 
} 
इस मामले में

, मैं EnterCriticalSection/MutexLock उपयोग करने के लिए इससे पहले कि अगर (डेटा == ..) की आवश्यकता है?

+0

आपके मामले में, आपको म्यूटक्स लॉक की आवश्यकता नहीं है। – Siddiqui

उत्तर

6

यदि आप केवल डेटा पढ़ रहे हैं तो कोई ताला आवश्यक नहीं है।

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

+0

यदि आदेश के बारे में परवाह नहीं है, तो भी आप चर को बदलना चाहते हैं अस्थिर, नहीं? – Inverse

+0

अस्थिरता का उपयोग कंपाइलर आर्किटेक्चर है जो बहु-थ्रेडिंग के संदर्भ में इसका अर्थ है। उचित दस्तावेज पढ़ें। –

1

यदि कुछ भी डेटा कभी नहीं बदलता है, तो अधिकांश आर्किटेक्चर पर, नहीं, आप नहीं करते हैं। लेकिन अगर डेटा में कभी भी कुछ भी नहीं बदलता है, तो कोड व्यर्थ है।

+0

यही वह था जो मैं सोच रहा था। – GManNickG

+6

किसी भी अतिरिक्त धागे को फैलाने से पहले कुछ ग्लोबल्स शुरू करने के लिए बहुत उपयोगी है, और डेटा पर उस बिंदु से पढ़ा जाता है लेकिन कभी भी लिखा नहीं जाता है। –

0

यदि आपका उदाहरण पहले से ही पूरा हो गया है तो कोई, आपको किसी भी महत्वपूर्ण खंड को लॉक या प्रबंधित करने की आवश्यकता नहीं है क्योंकि आप कुछ भी संशोधित नहीं कर रहे हैं।

लेकिन आप उदाहरण के लिए, यह है के रूप में, यह सिर्फ व्यर्थ है ..

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

0

जब आप साझा स्मृति को संशोधित नहीं कर रहे हैं तो आपको लॉक करने की आवश्यकता नहीं है, लेकिन आपका उदाहरण बहुत बेकार होगा क्योंकि आप data प्रारंभ करते हैं, आप इसकी कीमत जांचते हैं, लेकिन आप इसे कभी संशोधित नहीं करते ... दूसरा धागा है पूरी तरह से बेकार होने जा रहा है। क्या आप कहीं भी data परिवर्तनीय संशोधित करते हैं?

+0

यह सिर्फ मेरे कोड को कम कर रहा है, मेरे पास .ini फ़ाइल है जो धागे शुरू होने से पहले डेटा को पढ़ और सेट करता है, मुझे इसे संशोधित किए बिना बाद में कई थ्रेड से उस जानकारी तक पहुंचने की आवश्यकता है :) बेकार नहीं, एप्लिकेशन बहुत है बड़ा :)) – Tenev

+0

@ टीनेव, मैं यह कहने की कोशिश नहीं कर रहा हूं कि आप जो कर रहे हैं वह बेकार है, लेकिन उदाहरण के साथ आपने हमें प्रदान किया है इसका मतलब यह है कि दूसरा धागा कुछ भी नहीं कर रहा है क्योंकि "डेटा" हमेशा 5 है ... – Kiril

1

यदि डेटा को एक अलग थ्रेड द्वारा बदला जा रहा है, तो स्थिरता सुनिश्चित करने के लिए इसे पढ़ने के दौरान आपको स्मृति बाड़ की आवश्यकता होती है। एक ताला एक स्मृति बाड़ प्राप्त करने का एक तरीका है, लेकिन जरूरी नहीं कि इष्टतम। हालांकि, जब तक आप (माप के माध्यम से) नहीं पाते हैं कि लॉकिंग आपके प्रोग्राम को काफी धीमा कर रही है, तो शायद विकल्पों के बारे में चिंता करने योग्य नहीं है।

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

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