मुझे एक एप्लिकेशन लिख रहा है जो दो istreams
से इनपुट पर ब्लॉक करता है।अवरुद्ध बूस्ट :: थ्रेड
istream
से पढ़ना एक सिंक्रोनस (अवरुद्ध) कॉल है, इसलिए, मैंने पढ़ने के लिए दो Boost::thread
एस बनाने का निर्णय लिया।
या तो इनमें से एक थ्रेड "अंत" (प्राप्त कुछ इनपुट के आधार पर) तक पहुंच सकता है, और एक बार "अंत" पहुंचने के बाद, दोनों इनपुट स्ट्रीम प्राप्त करना बंद कर देते हैं। दुर्भाग्यवश, मुझे नहीं पता कि यह कौन करेगा।
इस प्रकार, मैं दोनों धागे पर join()
नहीं कर सकता, क्योंकि केवल एक थ्रेड (जिसे पूर्व निर्धारित नहीं किया जा सकता) वास्तव में वापस आ जाएगा (अनब्लॉक)।
मुझे किसी अन्य तरह से बाहर निकलने के लिए मजबूर होना चाहिए, लेकिन यह इनपुट के लिए इंतजार कर रहा है, इसलिए यह स्वयं तय नहीं कर सकता कि यह वापस आने का समय है (हालत चर या क्या नहीं)।
उनके एक तरह से या तो करने के लिए है:
- एक संकेत को बढ़ावा :: धागा, या
- एक
istream
"असफल" करने के लिए बाध्य करें भेजें, या - एक बूस्ट :: धागा मार?
नोट:
istreams
में से एकcin
- मैं इस प्रक्रिया को पुनः आरंभ करने की कोशिश कर रहा हूँ, इसलिए मैं बंद नहीं कर सकते इनपुट एक तरह से की अनुमति नहीं देतीं कि उन्हें reseting में धाराओं।
संपादित करें:
- मैं जब "अंत" तक पहुँच जाता है पता है, और मुझे पता है जो धागा सफलतापूर्वक समाप्त हो गया है, और जो मारे जाने की जरूरत है। इसकी हत्या मुझे समझने की जरूरत है (या एक आइसट्रीम से पढ़ने के लिए एक अलग रणनीति)।
- मैं दोनों धागे की जरूरत से बाहर निकलें और ठीक से सफाई :(को
धन्यवाद!
सौभाग्य से मैं अब के लिए एक लिनक्स मशीन के लिए विकास कर रहा हूं, लेकिन एक पोर्टेबल संस्करण पसंद करूंगा। इसके लिए धन्यवाद! – mmocny
pthread_cancel() इसे एक समान परिदृश्य में मेरे लिए नहीं बना रहा है, यहां तक कि इसके रद्दीकरण प्रकार को ASYNCHRONOUS में भी सेट नहीं किया गया है। – gatopeich