मैं बूस्ट प्रोग्रामिंग में नया हूं, और मैं io_service::work
का उपयोग करने का एक कारण ढूंढ रहा हूं, लेकिन मैं इसे समझ नहीं सकता; मेरे कुछ परीक्षणों में मैंने इसे हटा दिया और ठीक काम करता है।मुझे io_service :: कार्य का उपयोग क्यों करना चाहिए?
उत्तर
io_service::run()
ऑपरेशन चलाएगा जब तक कि असीमित संचालन करने के लिए असर हो। यदि, किसी भी समय, कोई एसिंक्रोनस ऑपरेशंस लंबित नहीं है (या हैंडलर को बुलाया जा रहा है), run()
कॉल वापस आ जाएगी।
हालांकि, कुछ डिज़ाइन हैं जो run()
कॉल करना पसंद नहीं करते हैं जब तक कि सभी काम नहीं किए जाते हैं और io_service
स्पष्ट रूप से निर्देश दिया गया है कि बाहर निकलना ठीक है। io_service::work
के लिए इसका उपयोग किया जाता है। work
ऑब्जेक्ट (मैं आमतौर पर इसे ढेर और साझा_प्टर पर करता हूं) बनाकर, io_service को हमेशा कुछ लंबित मानता है, और इसलिए run()
विधि वापस नहीं आती है। एक बार जब मैं सेवा से बाहर निकलने में सक्षम होना चाहता हूं (आमतौर पर शटडाउन के दौरान), तो मैं कार्य ऑब्जेक्ट को नष्ट कर दूंगा।
io_service::work
, सभी काम करता है कि io_service
का एक उदाहरण के लिए तैनात कर सकते हैं जब आप एक सॉकेट के साथ काम कर रहे हैं और एक अतुल्यकालिक पढ़ने शुरू उदाहरण के लिए, के आधार वर्ग है वास्तव में आप io_service
करने के लिए एक work
जोड़ रहे हैं। तो आप सामान्य रूप से work
सीधे का उपयोग कभी नहीं, लेकिन इसके लिए एक अपवाद है:
io_service::run
जैसे ही वहाँ ऐसा करने के लिए कोई और अधिक काम है के रूप में वापस आ जाएगी, इसलिए कुछ उत्पादक और उपभोक्ता धागे है कि एक आवेदन पत्र पर विचार, उत्पादकों कभी कभी काम करता है उत्पादन और उन्हें io_service::post
के साथ उपभोक्ता धागे पर पोस्ट करें, लेकिन यदि सभी काम समाप्त हो गए हैं, तो io_service::run
वापस आ जाएगा और संभवतः आपका उपभोक्ता धागा बंद हो जाएगा, इसलिए आपको io_service
व्यस्त रखने के लिए मनमाने ढंग से काम करने की आवश्यकता है, इस मामले में आप सीधे io_service::work
का उपयोग कर सकते हैं।
रीसेट() का उपयोग करने की तरह नष्ट करें? – lucastamoios
आमतौर पर, यदि मैं काम करने के लिए shared_ptr का उपयोग करता हूं, तो हाँ, मैं shared_ptr पर 'रीसेट() 'को कॉल करता हूं। –