2015-11-18 6 views
5

मैं एएसओ फ्रेमवर्क में काफी नया हूं, इसलिए कृपया दयालु रहें। मैं कई बढ़ावा asio उदाहरण जांच की और पाया कि लोगों को async का उपयोग इस तरह फोन किया है:बूस्ट: क्या एसिंक कॉल में एकाधिक रिकर्सन का उपयोग करना सुरक्षित है?

void read() 
{ 
    async_read(socket_, boost::asio::buffer(&user_[0], user_.size()), 
     boost::bind(&Connection::handle_user_read, this, 
     placeholders::error, placeholders::bytes_transferred)); 
} 
void handle_user_read(...) 
{ 
    ... 
    read(); 
    ... 
} 

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

क्या कोई इसे विवरण में समझा सकता है?

उत्तर

4

मुझे लगता है कि पढ़ा() फ़ंक्शन केवल I/O कतार में नया async पढ़ने का अनुरोध जोड़ता है और तुरंत बाहर निकलता है, इसलिए इस कोड में कोई रिकर्सन नहीं है।

मेरा मतलब है, पढ़ा() सीधे कनेक्शन :: handle_user_read को कॉल नहीं करता है। यह सिर्फ स्टोर आईओ कतार के अंदर फ़ंक्शन पॉइंटर है। जब यह डेटा का कुछ नया हिस्सा उपलब्ध होगा, तो यह फ़ंक्शन बाहरी कोड द्वारा असीमित रूप से लागू किया जा रहा है।

+0

तो: हाँ यह सुरक्षित है। बूस्ट प्रलेखन में वे ऐसा करते हैं। – Unda

+0

धन्यवाद, मैंने इसके बारे में सोचा नहीं था। अब यह पूरी तरह से स्पष्ट है। –

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