2009-07-05 11 views
11

मुझे एकल निर्माता-एकल उपभोक्ता के लिए कई कार्यान्वयन मिल गए हैं, लेकिन एकाधिक निर्माता-एकल उपभोक्ता के लिए कोई भी नहीं।क्या डेल्फी के लिए लॉक-फ्री कतार "एकाधिक उत्पादक-एकल उपभोक्ता" मौजूद है?

क्या डेल्फी के लिए "एकाधिक उत्पादक-एकल उपभोक्ता" के लिए लॉक-फ्री कतार मौजूद है?

+1

लॉक-मुक्त एल्गोरिदम और विकल्पों का उपयोग करके प्रदर्शन ट्यूनिंग के संबंध में एक बहुत ही रोचक उत्तर: http://stackoverflow.com/questions/853316/is-critical-section-always-faster/853510#853510। – mghie

उत्तर

5

OmniThreadLibrary से लॉक-फ्री कतार एकाधिक उत्पादकों का समर्थन करता है। आप इसे थ्रेडिंग लाइब्रेरी से अलग से उपयोग कर सकते हैं (यानी आप किसी भी अन्य ढांचे में ओटल कॉन्टैनेर्स यूनिट का उपयोग कर सकते हैं)।

जैसा कि डेनिएल ने नीचे बताया है, ओमनी थ्रेड लाइब्रेरी में दो कतार हैं। OtlContainers में से एक कई उत्पादकों और एकाधिक उपभोक्ताओं का समर्थन करता है जबकि OtlComm में "स्मार्ट" संस्करण (जो कि सरल संस्करण के लिए सिर्फ एक रैपर है) केवल एकल निर्माता/एकल उपभोक्ता है।

प्रलेखन अभी भी OmniThreadLibrary परियोजना :(। कतार पर कुछ जानकारी here पाया जा सकता है की एक बड़ी समस्या है।

+0

वास्तव में? मैंने आपकी सूची का उपयोग किया लेकिन स्रोत कोड में मेरे लिए एक "दुखद" टिप्पणी है ... "{: लॉक-फ्री, एकल लेखक, सिंगल रीडर रिंग बफर। } IOmniQueue = इंटरफेस [ '{AE6454A2-CDB4-43EE-9F1B-5A7307593EE9}'] " आप कहते हैं कि OmniQueue बहु उत्पादकों है, एकल उपभोक्ता, सक्षम? –

+0

क्षमा करें मेरी गलती।" उच्च स्तर "OtlComm में कतार एकल निर्माता/एकल उपभोक्ता है। ओटलकॉन्टेनर्स में "निम्न-स्तरीय" कतार कई उत्पादक/एकाधिक उपभोक्ता हैं। इसलिए यदि आप एकाधिक उत्पादकों का उपयोग करना चाहते हैं तो आपको कतार ऑब्जेक्ट के सरल संस्करण का उपयोग करना होगा। मैंने उपरोक्त पाठ को ठीक किया है सही इकाई नाम देखें। – gabr

3

यह सहायक हो सकता है: Interlocked SList functions

+0

+1। ध्यान दें कि यदि अनुप्रयोगों को प्री-एक्सपी विंडोज सिस्टम पर काम करने की आवश्यकता है तो इसका एक विकल्प लागू किया जाना चाहिए। ध्यान दें कि उपभोक्ता ब्लॉक को खाली कतार पर रखने का कोई आसान तरीका नहीं है। – mghie

+0

स्लाइस्ट फ़ंक्शन एक स्टैक उत्पन्न करते हैं, कतार नहीं। –

+2

@ रोब केनेडी: पूरी तरह से सच नहीं है, अगर उपभोक्ता InterlockedPopEntrySList() के बजाय InterlockedFlushSList() का उपयोग करता है, तो यह दोनों दिशाओं में सूची आइटम को संसाधित करने के लिए स्वतंत्र है। – mghie

2

http://svn.berlios.de/svnroot/repos/dzchart/utilities/dzLib/trunk/lockfree/

@Daniele टेटी:

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

+1

मैं इस सूची को ट्राइंग कर रहा हूं लेकिन ... कोड टिप्पणियां "लॉकफ्री" सूची के लिए अजीब हैं: "// दुर्भाग्य से यह संभव है कि अन्य धागे अभी भी // पुराने कतार के संदर्भ में हैं। // 100% यकीन है कि हम जब तक ActiveWriters गिनती // चला जाता है के लिए प्रतीक्षा करने की आवश्यकता होने के लिए 0 // वर्तमान लेखक हैं, तो हम घटना // जो पहले लेखक कि decrements द्वारा निर्धारित किया जाएगा के लिए प्रतीक्षा // ActiveWriters 0 पर। यदि नहीं हैं, तो प्रतीक्षा करने की कोई आवश्यकता नहीं है। " यह एक प्रकार का" प्रतीक्षा "सिंक्रनाइज़ेशन जैसा लगता है ... मैं गलत हूं? (मुझे यह टिप्पणियां फ़ंक्शन के अंदर मिलती हैं TMultiWriteSingleReadLockFreeQueue.Dequeue) –

2

एक बहु-निर्माता/एकल उपभोक्ता कतार/फीफो, आप आसानी से कर सकते हैं एक LockFree के लिए एसआईएलएसटी या एक छोटे लॉक फ्री लिफो स्टैक का उपयोग करना। आप जो करते हैं उसके पास उपभोक्ता के लिए दूसरा "निजी" स्टैक होता है (जिसे सादगी या आपके द्वारा चुने गए किसी अन्य स्टैक मॉडल के लिए एसआईएलटीटी के रूप में भी किया जा सकता है)। उपभोक्ता आइटम को बंद करता है निजी स्टैक। जब भी निजी लिफो को निकाला जाता है, तो आप साझा समवर्ती एसएलआईएसटी (पूरे स्लीस्ट चेन को पकड़ने) के पॉप के बजाए फ्लश करते हैं और फिर फ्लैश सूची को निजी स्टैक पर पुश करने वाली वस्तुओं को धक्का देते हैं।

यह सिंगल-निर्माता/सिंगल-उपभोक्ता और एकाधिक-निर्माता/एकल-उपभोक्ता के लिए काम करता है।

हालांकि, यह एकाधिक-निर्माता/एकाधिक उपभोक्ता मामलों के लिए काम नहीं करता है।

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