यह सिंक्रनाइज़ेशन के बिना सुरक्षित नहीं है। रीडिंग थ्रेड एक ही समय में पढ़ने के बीच में हो सकते हैं क्योंकि लेखन धागा सूची को संशोधित करता है। और सूची को संशोधित करने से अंतर्निहित स्मृति को पुन: आवंटित करना हो सकता है।
आरटीएल इस तरह के परिदृश्य के लिए 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>
।
स्रोत
2013-01-20 15:10:47
हम्म। जिसने कभी मेरा दिमाग नहीं मारा, मैंने सोचा कि यह एक प्रकार का सुरक्षित होगा अगर केवल एक धागा इसे लिखता है लेकिन आपने कभी भी उस समस्या के बारे में सोचा नहीं है जिसे आपने अभी मंजूरी दे दी है। तो मुझे तब एक tthreadlist का उपयोग करना चाहिए। धन्यवाद –
मैं इंडी के TIdThreadSafeList का उपयोग करूंगा, मैं बस लॉकिंग और अनलॉक करने के विचार को छोड़ने की कोशिश कर रहा था। सर्वर में कई थ्रेडसाफलिस्ट हैं और प्रत्येक ऑपरेशन के लिए लॉकिंग करते हैं जो बहुत बार होने की संभावना है, बस इतना समय लगता है। –
इससे बहुत अधिक विवाद हो सकता है, क्योंकि केवल एक ही धागा किसी भी समय सूची तक पहुंच सकता है। सूची में संग्रहीत डेटा के प्रकार के आधार पर, और यदि लेखक आइटम को हटा नहीं देता है, तो एक अच्छा अनुकूलन उम्मीदवार पाठक को सामग्री को कॉपी करने के लिए सूची को लॉक करने के लिए कोड करना है, इसे अनलॉक करना है और फिर इसे पूरा करना है प्रतिलिपि # नकल। आप अन्य मामलों में एक से अधिक पाठक-एकल लेखक दृष्टिकोण में भी सोच सकते हैं। – jachguate