2013-01-20 17 views
6

क्या यह एक बहुप्रचारित अनुप्रयोग में टीएलआईस्ट का उपयोग सुरक्षित है, जो अन्य सभी धागे द्वारा उपयोग किया जाता है लेकिन केवल एक धागा इसे लिखता है। परिदृश्यमल्टीथ्रेडिंग में डेल्फी टीएलिस्ट

प्रत्येक थ्रेड के लिए एक अनूठा टीएलिस्ट जो केवल थ्रेड लिखता है जबकि अन्य धागे इसे डेटा प्राप्त करने के लिए बस एक्सेस करेंगे।

क्या यह सुरक्षित है?

उत्तर

10

यह सिंक्रनाइज़ेशन के बिना सुरक्षित नहीं है। रीडिंग थ्रेड एक ही समय में पढ़ने के बीच में हो सकते हैं क्योंकि लेखन धागा सूची को संशोधित करता है। और सूची को संशोधित करने से अंतर्निहित स्मृति को पुन: आवंटित करना हो सकता है।

आरटीएल इस तरह के परिदृश्य के लिए TThreadList कक्षा प्रदान करता है। प्रत्येक धागे, दोनों लेखन और धागे पढ़ने, LockList और UnlockList जोड़े में सूची में सभी पहुंच को लपेटने की आवश्यकता है।

var 
    ThreadList: TThreadList;//declared in some shared location 
.... 
//each thread accesses the list like this: 
var 
    List: TList; 
.... 
List := ThreadList.LockList; 
try 
    .... do stuff with List 
finally 
    ThreadList.UnlockList; 
end; 

आप एक डेल्फी कि जेनरिक का समर्थन करता है उपयोग कर रहे हैं वहाँ एक सामान्य संस्करण है, TThreadList<T>

+0

हम्म। जिसने कभी मेरा दिमाग नहीं मारा, मैंने सोचा कि यह एक प्रकार का सुरक्षित होगा अगर केवल एक धागा इसे लिखता है लेकिन आपने कभी भी उस समस्या के बारे में सोचा नहीं है जिसे आपने अभी मंजूरी दे दी है। तो मुझे तब एक tthreadlist का उपयोग करना चाहिए। धन्यवाद –

+0

मैं इंडी के TIdThreadSafeList का उपयोग करूंगा, मैं बस लॉकिंग और अनलॉक करने के विचार को छोड़ने की कोशिश कर रहा था। सर्वर में कई थ्रेडसाफलिस्ट हैं और प्रत्येक ऑपरेशन के लिए लॉकिंग करते हैं जो बहुत बार होने की संभावना है, बस इतना समय लगता है। –

+0

इससे बहुत अधिक विवाद हो सकता है, क्योंकि केवल एक ही धागा किसी भी समय सूची तक पहुंच सकता है। सूची में संग्रहीत डेटा के प्रकार के आधार पर, और यदि लेखक आइटम को हटा नहीं देता है, तो एक अच्छा अनुकूलन उम्मीदवार पाठक को सामग्री को कॉपी करने के लिए सूची को लॉक करने के लिए कोड करना है, इसे अनलॉक करना है और फिर इसे पूरा करना है प्रतिलिपि # नकल। आप अन्य मामलों में एक से अधिक पाठक-एकल लेखक दृष्टिकोण में भी सोच सकते हैं। – jachguate

5

जैसा कि अन्य ने कहा है, TList स्वयं ही थ्रेड-सुरक्षित नहीं है। यदि आप TThreadList (जो आंतरिक रूप से महत्वपूर्ण अनुभाग का उपयोग करते हैं) का उपयोग करने के ऊपरी हिस्से के बारे में चिंतित हैं, तो TMultiReadSingleWriteSynchronizer, या यहां तक ​​कि Win32 SRW lock के साथ अपने मौजूदा TList कोड को लपेटने पर एक नज़र डालें।

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