vb.net - .NET multi-threaded variable access -
मेरे पास 4 धागे के साथ एक आवेदन है। (जीयूआई, नियंत्रक, निर्माता, उपभोक्ता)
जीयूआई आत्म-व्याख्यात्मक है।
कुछ प्रारंभिक सेटअप के बाद नियंत्रक उत्पादक और उपभोक्ता धागे शुरू करता है।
निर्माता आइटम बनाता है और उन्हें एक "रिंग बफर" में एक मुक्त स्लॉट में रखता है
उपभोक्ता "रिंग बफर" से आइटम लेता है और उन्हें डिस्क पर लिखता है।
निर्माता बनाता है उपभोक्ता की तुलना में अधिक उच्च दर पर आइटम।
उपभोक्ता IO भारी है और IO बाध्य है।
वर्तमान में मैं यह निर्धारित करने के लिए प्रत्येक रिंग बफर स्लॉट में एक चर को देख रहा हूँ लिखित में।
अगर स्लॉट फ्री। तो लिट स्लॉट.डेटा डिस्क से समाप्त हो गया है अगर
मैं लॉक / सिंकलॉक का उपयोग नहीं कर रहा हूं इसके बजाय मैं स्लॉट के मूल्य को पढ़ रहा / लिख रहा हूं "मुफ़्त" चर मुझे विश्वास नहीं है कि यह सही है, हालांकि यह एक अस्थिर पढ़ा / लिखना है। क्या इस चर को पढ़ने / लिखने के लिए एक बेहतर तरीका है? वेरिएबल "पूर्णांक" प्रकार है और या तो 0 या 1 है।
आप एक अंगूठी बफर लेकिन एक (ठीक से कार्यान्वित) अंगूठी बफर यह निर्धारित करने में सक्षम होगा कि क्या यह सब तत्वों की जांच किए बिना पूर्ण है, प्रत्येक स्लॉट में बूलियन की आवश्यकता को समाप्त करने के लिए।
मुझे VB.NET, लेकिन यह एक रिंग बफर के कार्यान्वयन (यदि कच्चे तेल) के कार्यान्वयन होना चाहिए, जो कि संबंधित लेखन / पठन कार्यों पर पूर्ण / खाली होने पर रोकता है।
<प्री> मित्र वर्ग RingBuffer (टी के) निजी _slots () के रूप में टी निजी _head के रूप में पूर्णांक निजी _tail के रूप में पूर्णांक निजी _readableSlots सेमाफोर के रूप में निजी _readLock वस्तु के रूप में निजी _writableSlots सेमाफोर निजी _writeLock के रूप में वस्तु सार्वजनिक उप नया (आकार, आकार) के रूप में (आकार - 1) _slots (आकार - 1) _head = 0 _tail = 0 _readLock = नया ऑब्जेक्ट _writeLock = नया ऑब्जेक्ट _readableSlots = नया सेमाफोर (0, आकार) _writableSlots = नया सेमाफोर (आकार, आकार) अंत उप लोक समारोह Dequeue () के रूप में टी मंद आइटम के रूप में टी _readableSlots.WaitOne () SyncLock _readLock आइटम = _slots (_head) _head = (_head + 1) मॉड _slots.Length समाप्ति सिंकलॉक _writableSlots.Release () आइटम लौटें अंत समारोह सार्वजनिक उप एनक्यू (ByVal आइटम के रूप में टी) _writableSlots.WaitOne () सिंकलॉक _writeLock _slots (_tail) = आइटम _tail = (_tail + 1) Mod _slots.Length समाप्ति सिंकलॉक _readableSlots.Release () समाप्ति उप अंत कक्षा
एक बार आपके पास, आपके निर्माता और उपभोक्ता वास्तव में गूंगा हो सकता है :) यह नहीं है निश्चित रूप से गारंटी दी गई है कि आपके पास कई उपभोक्ता हैं, तो आइटम संसाधित होते हैं:
Ringbuffer के रूप में निजी _ बैफर (पूर्णांक के) = नए अंगूठी (पूर्णांक के) (5) निजी उप निर्माता () मंद मैं पूर्णांक के रूप में = 0 जबकि सही _बफर। एन्क्यू (i) i = i + 1 लूप एंड सब प्राइवेट सब कंज्यूमर () करो जबकि असली डिबग। विरलाइन (("उपभोक्ता ए:" & amp; _buffer.Dequeue) थ्रेड। नींद (1000) लूप एंड उप
Comments
Post a Comment