2015-06-30 8 views
5

बुलाने की क्या प्रभाव पड़ा है:निम्न स्कीमा बढ़ावा asio प्रलेखन से आते हैं io_service :: चलाने विधि दो बार

enter image description here

मैं समझता हूँ कि अगर मैं दो बार io_service::run विधि कॉल (दो अलग धागे में), मैं समापन से घटनाओं को डेक करने के लिए दो धागे होंगे, असीमित घटना डेमल्टीप्लेक्सर के माध्यम से इवेंट कतार मैं सही हूँ?

अधिक सटीक, मेरा संदेह io_service::run विधि के एकाधिक कॉल द्वारा प्राप्त parrallelization पर है। उदाहरण के लिए सॉकेट से निपटने पर, उदाहरण के लिए, मेरे पास io_service object पर दो सॉकेट बाध्य हैं, प्रत्येक सॉकेट socket.async_read_some विधि को कॉल कर रहा है, क्या इसमें 2 पंजीकृत कॉलबैक शामिल हैं (async_read_some विधि के माध्यम से) io_service::run पर दो बार कॉल करते समय संगत रूप से कॉल किया जा सकता है।

+1

आप इसे सही ढंग से समझते हैं। यहां उपयोगी लिंक है जो इसे विवरण में बताता है: http://theboostcpplibraries.com/boost.asio-scalability –

उत्तर

4

आपकी धारणाएं सही हैं। प्रत्येक थ्रेड जो io_service::run() को कॉल करता है, समानांतर में हैंडलर (सरल फ़ंक्शन ऑब्जेक्ट) निष्पादित और निष्पादित करेगा। यह निश्चित रूप से केवल तभी समझ में आता है जब आपके पास io_service (जैसे दो सॉकेट, सॉकेट और टाइमर, कई एक साथ post() कॉल और अन्य) को खिलाते हुए ईवेंट के एक से अधिक स्रोत हैं।

सॉकेट के async_read() पर प्रत्येक कॉल के परिणामस्वरूप io_service में वास्तव में एक हैंडलर कतारबद्ध किया जाएगा। केवल आपके धागे में से एक इसे हटा देगा और इसे निष्पादित करेगा।

एक बार प्रति सॉकेट पर एक से अधिक बार async_read() को कॉल न करने के लिए सावधान रहें।

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