2012-10-09 22 views
17

मैं कुछ जावा कोड को सी ++ पर पोर्ट करने की प्रक्रिया में हूं, और एक विशेष अनुभाग कई उत्पादकों से संदेशों को एक उपभोक्ता को पास करने के लिए ब्लॉकिंगक्यूयू का उपयोग करता है।सी ++ जावा के अवरुद्ध करने के लिए समतुल्य

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

टाइमआउट मेरे उपयोग-मामले के लिए प्रासंगिक हैं, इसलिए एक सिफारिश जो उन्हें आपूर्ति करती है आदर्श है। यदि नहीं, तो मैं कुछ खुद को कोड कर सकता हूं।

मैंने बूस्ट पुस्तकालयों को चारों ओर घुमाया और जल्दी से ब्राउज़ किया और मुझे ऐसा कुछ नहीं मिला। शायद मैं यहाँ अंधा हूं ... लेकिन क्या किसी को भी अच्छी सिफारिश के बारे में पता है?

धन्यवाद!

#include <mutex> 
#include <condition_variable> 
#include <deque> 

template <typename T> 
class queue 
{ 
private: 
    std::mutex    d_mutex; 
    std::condition_variable d_condition; 
    std::deque<T>   d_queue; 
public: 
    void push(T const& value) { 
     { 
      std::unique_lock<std::mutex> lock(this->d_mutex); 
      d_queue.push_front(value); 
     } 
     this->d_condition.notify_one(); 
    } 
    T pop() { 
     std::unique_lock<std::mutex> lock(this->d_mutex); 
     this->d_condition.wait(lock, [=]{ return !this->d_queue.empty(); }); 
     T rc(std::move(this->d_queue.back())); 
     this->d_queue.pop_back(); 
     return rc; 
    } 
}; 

यह विस्तार करने के लिए तुच्छ होना चाहिए और उपयोग:

+0

हाथ से बना वर्ग जिसमें एक सरणी है (शायद आसान pop_front push_back के लिए सरणी के बजाय डेक) और mutex? – NoSenseEtAl

+0

हार्ड क्षमता वास्तव में एक आवश्यकता है? –

+1

मेरे मामले में, हाँ। यह बहुत संभव है कि निर्माता उपभोक्ताओं को आगे बढ़ाएं, और मुझे निर्माता पक्ष पर धागे को अवरुद्ध करने की आवश्यकता है, या अन्यथा उनके इनपुट को अस्वीकार कर दें, न कि मैं स्मृति से बाहर हो जाऊं! – Ben

उत्तर

32

यह आकार तय नहीं है और यह समय समाप्ति का समर्थन नहीं करता, लेकिन यहाँ एक कतार का एक सरल कार्यान्वयन मैं हाल ही में पोस्ट किया था सी ++ 2011 निर्माणों उपयोग कर रहा है पॉपिंग के लिए एक समय प्रतीक्षा। मैंने ऐसा नहीं किया है कि मुख्य कारण यह है कि मैं अब तक के इंटरफ़ेस विकल्पों से खुश नहीं हूं।

+0

धक्का सहायक में स्कोपिंग है? मुझे लगता है कि आप mutex को अनलॉक करने का प्रयास कर रहे हैं ... लेकिन मुझे notify_one के लिए पूर्व शर्त के बारे में निश्चित नहीं है। – NoSenseEtAl

+8

'पुश()' में दायरा आवश्यक नहीं है लेकिन इसके बिना लॉक अभी भी आयोजित होने पर हालत परिवर्तनीय संकेत दिया गया है। सिग्नलिंग से पहले लॉक को रिहा करने से ताला आसानी से उपलब्ध हो जाता है। –

+0

क्या कोई व्यक्ति इस उदाहरण को 'पॉपिंग के लिए समयबद्ध प्रतीक्षा' के लिए सीमित कर सकता है? – javapowered

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