2010-10-13 11 views
15

वीएस -2010 में पेश किए गए समवर्ती रनटाइम में, एक समवर्ती_क्यू कक्षा है। इसमें एक गैर अवरुद्ध try_pop() फ़ंक्शन है।
इंटेल थ्रेड बिल्डिंग ब्लॉक (टीबीबी) में समान, संस्करण 2.1 से 2.2 तक जाने पर अवरुद्ध पॉप() कॉल हटा दिया गया था।समवर्ती_क्यू गैर-अवरोध क्यों है?

मुझे आश्चर्य है कि अवरोधक कॉल के साथ समस्या क्या है। इसे टीबीबी से क्यों हटा दिया गया था? और क्यों कोई अवरुद्ध concurrent_queue नहीं है?

मैं ऐसी परिस्थिति में हूं जहां मुझे अवरुद्ध समवर्ती कतार की आवश्यकता है, और मुझे व्यस्त प्रतीक्षा नहीं चाहिए। खुद को एक कतार लिखने के अलावा, क्या समवर्ती रनटाइम में एक और संभावना है?

उत्तर

25
a comment from Arch Robison से

, और यह अधिक से अधिक "horse's mouth" नहीं मिलता है कि (क):


पीपीएल के concurrent_queue कोई अवरुद्ध पॉप, इसलिए है न tbb::strict_ppl::concurrent_queue करता है। अवरुद्ध पॉप tbb::concurrent_bounded_queue में उपलब्ध है।

अवरुद्ध पॉप को छोड़ने के लिए डिज़ाइन तर्क यह है कि कई मामलों में, अवरुद्ध करने के लिए सिंक्रनाइज़ेशन कतार के बाहर प्रदान किया जाता है, इस स्थिति में कतार के अंदर अवरुद्ध करने का कार्यान्वयन अनावश्यक ओवरहेड बन जाता है।

दूसरी ओर, पुराने tbb::concurrent_queue के अवरुद्ध पॉप उन उपयोगकर्ताओं के बीच लोकप्रिय थे जिनके पास बाहरी सिंक्रनाइज़ेशन नहीं था।

तो हम कार्यक्षमता को विभाजित करते हैं। उन मामलों का प्रयोग करें जिन्हें अवरुद्ध करने या बाध्यता की आवश्यकता नहीं है, नए tbb::concurrent_queue का उपयोग कर सकते हैं, और जिन मामलों की आवश्यकता है उनका उपयोग tbb::concurrent_bounded_queue का उपयोग कर सकते हैं।


(क) आर्क थ्रेडिंग बिल्डिंग ब्लॉक्स के वास्तुकार है।

4

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

0

कतार के दृष्टिकोण से कोई स्थिति नहीं है, इसे को को डालने या निकालने के लिए अवरोधित करने की आवश्यकता है। तथ्य यह है कि आपको अवरुद्ध करने और प्रतीक्षा करने की प्रतीक्षा करने की आवश्यकता हो सकती है।

आप एक शर्त चर, या एक गिनती सेमफोर, या उन पंक्तियों के साथ कुछ (जो भी आपका विशिष्ट एपीआई प्रदान करता है) का उपयोग करके इच्छित कार्यक्षमता प्राप्त कर सकते हैं। आपकी परेशानी अवरुद्ध/गैर-अवरोधन के साथ नहीं है; यह एक क्लासिक निर्माता-उपभोक्ता की तरह लगता है।

+2

, आप * किसी भी तुल्यकालन पुरातन खुद लिखने के लिए जरूरत के बिना लागू कर सकते हैं *" क्लासिक निर्माता-उपभोक्त "कोड के बारे में दो लाइनों में TBB का उपयोग कर,। (उपभोक्ता '(सत्य) उपभोग करता है (Q.pop()); और निर्माता' जबकि (सत्य) Q.push (उत्पादन()) करता है; '।) अवरुद्ध 'पॉप' के बिना, वही समस्या कम से कम दोगुनी कोड की आवश्यकता होती है: अर्थात्, एक अतिरिक्त शर्त चर प्रति कतार बहीखाता। लेकिन जैसा कि पक्सडीब्लो कहते हैं, 'tbb :: concurrent_bounded_queue' अवरुद्ध' पॉप' कार्यक्षमता प्रदान करना जारी रखता है, और मूल रूप से 'concurrent_queue' के लिए ड्रॉप-इन प्रतिस्थापन है। – Quuxplusone

2

सवाल यह था कि अगर कंसुरेंसी रनटाइम में एक और विकल्प था जो ब्लॉकिंग कतार कार्यक्षमता प्रदान करता है क्योंकि concurrent_queue VS2010 में नहीं है और कोई नहीं है।

आर्क की टिप्पणी बिल्कुल पूरी तरह से सही है, कतारों को अवरुद्ध करना और कतारों को अनब्लॉक करना अलग-अलग उपयोग के मामले हैं और यही कारण है कि वे वीएस -2010 और टीबीबी में अलग हैं।

वीएस -2010 में आप टेम्पलेट क्लास unbounded_buffer का उपयोग कर सकते हैं, उपयुक्त विधियों को एनक्यू और डेक्यू कहा जाता है।

-रिक

एक अवरुद्ध `pop` साथ
संबंधित मुद्दे