2011-07-29 23 views
8

स्ट्रैंड के माध्यम से सॉकेट पर async_ * ऑपरेशन कैसे करें? मैंने टाइमर 5 (बूस्ट/असियो उदाहरण) को देखा है, लेकिन वे केवल दिखाते हैं कि उपयोगकर्ता के हैंडलर को कैसे बुलाया जाए। जब मैं multithreaded अनुप्रयोग डेटा में सॉकेट में async_write दूषित लिखा जा सकता है। और strand गारंटी देता है कि इनमें से कोई भी हैंडलर एक साथ निष्पादित नहीं करेगा।बूस्ट :: एएसओ सॉकेट async_ * स्ट्रैंड

+1

आपको विशेष रूप से समस्याएं क्या हैं? एक 'स्ट्रैंड' का उपयोग करते हुए 'स्ट्रैंड' बनाम _not_ का उपयोग करते समय एसिंक ऑपरेशंस को निष्पादित करना काफी अलग नहीं है। बस अपने हैंडलर को स्ट्रैंड में लपेटें। – Chad

+0

यह प्रश्न वर्तमान में phrased के रूप में समझ में नहीं आता है, कृपया इसे संपादित करें और कुछ स्पष्टता जोड़ें। –

+0

यह मेरे लिए एक सही समझ बनाता है। मुझे भी यही तकलीफ़ है। एकाधिक धागे एक कनेक्शन को पढ़ने/लिखने के अनुरोध प्रतिक्रियाओं का उपयोग करने की कोशिश कर रहे हैं और सभी गड़बड़ हो गए हैं। जो मैं प्राप्त करने की कोशिश कर रहा हूं वह एक स्क्वेंशियल रीड अनुरोध है/जो भी प्रक्रिया करने की आवश्यकता है (यहां तक ​​कि एक और अनुरोध/विभिन्न सेवा के प्रति प्रतिक्रिया) और फिर मूल अनुरोधकर्ता को प्रतिक्रिया वापस कर दें। – Roskoto

उत्तर

4

से Boost.Asio डॉक्स:

io_service :: किनारा वर्ग पोस्ट करने की क्षमता प्रदान करता है और गारंटी नहीं है कि उन लोगों के संचालकों में से कोई भी समवर्ती निष्पादित करेंगे साथ संचालकों प्रेषण।

Boost.Asio उदाहरण में strand उपयोग के a good example नहीं है।

strand गारंटी देता है कि आपके हैंडलर निष्पादन को सिंक्रनाइज़ किया जाएगा। इसका मतलब है कि strand उपयोगी है यदि आपके io_service एकाधिक धागे से निष्पादित किया गया है। यह आपके कार्यों (हैंडलर) को शेड्यूल करने से संबंधित नहीं है।

strand एकाधिक सॉकेट को पढ़ने या ओप लिखने में आपकी मदद नहीं कर सकता है, क्योंकि आंतरिक पढ़ने/लिखने के निष्पादन को समवर्ती रूप से नहीं किया जा सकता है, इसलिए केवल एक सक्रिय पढ़ना चाहिए या async op लिखना चाहिए।

reads के लिए आप पढ़ने के अनुक्रम को शुरू करने के लिए बस async_read पर कॉल करें और प्राप्त डेटा लेने के बाद इसे अपने पढ़ने वाले हैंडलर से फिर से कॉल करें। वही है जो आप एकल थ्रेडेड वातावरण में करते हैं।

writes के लिए यदि समवर्ती उत्पादक हैं (यदि एकाधिक धागे सॉकेट पर डेटा लिखने के लिए डेटा प्रदान करते हैं) तो आपको एक समवर्ती कतार की आवश्यकता होती है (उदा। boost circular buffer, "बोल्ड बफर उदाहरण" देखें)। आपका लेखन फ़ंक्शन इस बफर से डेटा लेता है और एसिंक इसे सॉकेट में लिखता है। आपका लेखन हैंडलर आपके लेखन समारोह को आमंत्रित करता है।

3

जब मैं बहु आवेदन डेटा में सॉकेट से async_write() भ्रष्ट लिखा जा सकता है। और स्ट्रैंड गारंटी है कि उनमें से कोई भी हैंडलर एक साथ निष्पादित करेंगे।

यदि एकाधिक धागे को सॉकेट पर डेटा लिखने की आवश्यकता है, तो आपको डेटा का ऑर्डर करना होगा। यह async_write()documentation में स्पष्ट रूप से स्पष्ट है।

कार्यक्रम सुनिश्चित करना चाहिए कि धारा इस आपरेशन पूरा करता है जब तक (जैसे async_write, धारा के async_write_some समारोह, या किसी अन्य की रचना कार्य है कि राईट प्रदर्शन के रूप में) कोई अन्य लिखने संचालन करता है।

मैं संदेशों के एक निवर्तमान कतार, जो बहुत this question और मेरे answer के समान है बनाए रखने के सुझाव देते हैं।

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