मैं कुछ जावा कोड को सी ++ पर पोर्ट करने की प्रक्रिया में हूं, और एक विशेष अनुभाग कई उत्पादकों से संदेशों को एक उपभोक्ता को पास करने के लिए ब्लॉकिंगक्यूयू का उपयोग करता है।सी ++ जावा के अवरुद्ध करने के लिए समतुल्य
यदि आप जावा अवरोधक्यूयू के बारे में परिचित नहीं हैं, तो यह केवल एक कतार है जिसमें हार्ड क्षमता है, जो कतार से() और ले() ले जाने के लिए थ्रेड सुरक्षित विधियों का खुलासा करता है। कतार भरने पर ब्लॉक() ब्लॉक करें, और कतार खाली होने पर ब्लॉक() ब्लॉक करें। साथ ही, इन विधियों के टाइमआउट-संवेदनशील संस्करणों की आपूर्ति की जाती है।
टाइमआउट मेरे उपयोग-मामले के लिए प्रासंगिक हैं, इसलिए एक सिफारिश जो उन्हें आपूर्ति करती है आदर्श है। यदि नहीं, तो मैं कुछ खुद को कोड कर सकता हूं।
मैंने बूस्ट पुस्तकालयों को चारों ओर घुमाया और जल्दी से ब्राउज़ किया और मुझे ऐसा कुछ नहीं मिला। शायद मैं यहाँ अंधा हूं ... लेकिन क्या किसी को भी अच्छी सिफारिश के बारे में पता है?
धन्यवाद!
#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;
}
};
यह विस्तार करने के लिए तुच्छ होना चाहिए और उपयोग:
हाथ से बना वर्ग जिसमें एक सरणी है (शायद आसान pop_front push_back के लिए सरणी के बजाय डेक) और mutex? – NoSenseEtAl
हार्ड क्षमता वास्तव में एक आवश्यकता है? –
मेरे मामले में, हाँ। यह बहुत संभव है कि निर्माता उपभोक्ताओं को आगे बढ़ाएं, और मुझे निर्माता पक्ष पर धागे को अवरुद्ध करने की आवश्यकता है, या अन्यथा उनके इनपुट को अस्वीकार कर दें, न कि मैं स्मृति से बाहर हो जाऊं! – Ben