2012-05-23 13 views
5

मेरा कोड विभिन्न सॉकेट ऑपरेशंस करने के लिए एक थ्रेड में बूस्ट :: एएसओ और io_service का उपयोग करता है। सभी ऑपरेशन एसिंक्रोनस हैं और ऑपरेशन के परिणाम को निर्धारित करने के लिए प्रत्येक हैंडलर boost::system::error_code (विशेष रूप से boost::asio::error::operation_aborted) पर निर्भर करता है।बूस्ट :: रद्दीकरण के बाद त्रुटि के बिना एएसआई एसिंक हैंडलर

यह पूरी तरह से अच्छा काम कर रहा है जब तक कि मैंने कई समवर्ती कनेक्शन बनाने और सबसे तेज़ चुनने के लिए तर्क बदल दिया है। यही है, जब पहली async_read_some हैंडलर आग लगती है, तो मैं अन्य सॉकेट (शट डाउन, क्लोज़ - सबकुछ) रद्द करता हूं और वर्तमान के साथ आगे बढ़ता हूं। 95% मामलों में अन्य सॉकेट के पढ़ने वाले हैंडलर को ऑपरेशन_बॉर्टेड त्रुटि के साथ बुलाया जाता है। हालांकि कभी-कभी, इन पढ़ने वाले हैंडलर त्रुटियों के बिना बुलाए जाते हैं, मुझे बताते हैं कि उन्हें सफलतापूर्वक एन बाइट प्राप्त हुए हैं।

लेकिन सॉकेट के लिए दस्तावेज़ :: रद्द() states:

इस समारोह सभी बकाया अतुल्यकालिक कनेक्ट, भेजने का कारण बनता है और संचालन प्राप्त तुरंत समाप्त करने के लिए, और रद्द संचालन के लिए संचालकों पारित हो जाएगा boost::asio::error::operation_aborted त्रुटि।

तो, प्रश्न: क्या मैं वास्तव में उत्पादन कोड में operation_aborted त्रुटि पर भरोसा कर सकता हूं? यदि मैं कर सकता हूं, क्या यह एएसओओ में 1.46.1 से बढ़कर एक बग है? यदि मैं नहीं कर सकता, तो क्या इसके बारे में कोई आधिकारिक दस्तावेज है?

+1

ऐसा लगता है कि रद्द करने से पहले कई हैंडलर "सफल" हो चुके हैं। आप किसी भी हैंडलर को पास करने के लिए 'operation_aborted' पर भरोसा कर सकते हैं, जो पहले से निष्पादित नहीं है (और कॉल करने का इंतजार कर रहे हैं)। – Chad

उत्तर

11

ठीक है, जवाब:

  1. नहीं, मैं केवल operation_aborted त्रुटि पर भरोसा नहीं कर सकते हैं।
  2. बेशक, यह असियो में एक बग नहीं है, केवल मेरी तरफ से अनुभव की कमी है।
  3. आधिकारिक documentation का थोड़ा सा हिस्सा है। यह टाइमर के लिए है, सॉकेट नहीं है, हालांकि एक ही सिद्धांत लागू होते हैं:

तो टाइमर पहले से ही समाप्त हो गया है जब रद्द() कहा जाता है, तो अतुल्यकालिक इंतजार के संचालन के लिए संचालकों करेंगे:

  • पहले से ही बुलाया गया है; या
  • निकट भविष्य में आमंत्रण के लिए कतारबद्ध किया गया है।

मूल रूप से, मैं इस धारणा में गलत था कि अगर मैं io_service के लिए किसी एकल थ्रेड उपयोग करते हैं, तो हर आपरेशन अवरुद्ध हो जाएगा, जबकि कुछ हैंडलर निष्पादित करता है।

जिस व्यवहार का मैं रिपोर्ट कर रहा हूं वह वास्तव में बहुत समझ में आता है और ऐसा लगता है कि जो भी एएसओ का उपयोग करता है वह जानता है।मैंने एएसओ की मेलिंग सूचियों के माध्यम से काम किया है और इस विषय पर here, here, here और here पर बहुत सी चर्चाएं मिली हैं।

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

+1

+1 अपने खुद के प्रश्न के साफ जवाब के लिए –

2

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

तो अपनी आवश्यकता को लागू करने के लिए आपको थोड़ा और तर्क चाहिए।

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