का उपयोग करके पढ़ा मैं एक निर्माता/उपभोक्ता परिदृश्य है कि इंटरफेस है कि मोटे तौर पर कर रहे हैं का अनुसरण करता है लागू करने के लिए करना चाहते हैं:लागू करने के लिए कैसे अवरुद्ध POSIX धागे
class Consumer {
private:
vector<char> read(size_t n) {
// If the internal buffer has `n` elements, then dequeue them
// Otherwise wait for more data and try again
}
public:
void run() {
read(10);
read(4839);
// etc
}
void feed(const vector<char> &more) {
// Safely queue the data
// Notify `read` that there is now more data
}
};
इस मामले में, feed
और run
अलग धागे और read
पर चलेगा चाहिए अवरुद्ध हो जाना (जैसे recv
और fread
)। जाहिर है, मुझे अपने डेक पर किसी प्रकार का पारस्परिक बहिष्कार की आवश्यकता होगी, और मुझे फिर से प्रयास करने के लिए read
को सूचित करने के लिए किसी प्रकार की अधिसूचना प्रणाली की आवश्यकता होगी।
मुझे सुना है हालत चर जाने का रास्ता है, लेकिन मेरे सभी मल्टीथ्रेडिंग अनुभव विंडोज के साथ हैं और मेरे चारों ओर मेरे सिर को लपेटने में कठिनाई हो रही है।
किसी भी मदद के लिए धन्यवाद!
(हाँ, मैं जानता हूँ कि यह वैक्टर वापस जाने के लिए अक्षम है। चलो कि में मिलता है।)
यह बहुत अच्छा लग रहा है। एक नोट (केवल एक परिशोधन), लेकिन अधिकांश साइटों का कहना है कि आपको दौड़ की स्थिति को रोकने के लिए कंडीशन वैरिएबल को एक म्यूटेक्स से बचाने की आवश्यकता है। मल्टीथ्रेडिंग मजेदार है, है ना? –
स्थिति चर एक mutex द्वारा संरक्षित है। दोनों मामलों में पढ़ें() और फ़ीड() आपको स्थिति चर के साथ कुछ भी करने से पहले लॉक प्राप्त करना होगा। –
इसके बारे में क्षमा करें। मैंने इसे आपके कोड में याद किया। बहुत अच्छा। –