2012-11-04 16 views
5

मैं बूस्ट प्रोग्रामिंग में नया हूं, और मैं io_service::work का उपयोग करने का एक कारण ढूंढ रहा हूं, लेकिन मैं इसे समझ नहीं सकता; मेरे कुछ परीक्षणों में मैंने इसे हटा दिया और ठीक काम करता है।मुझे io_service :: कार्य का उपयोग क्यों करना चाहिए?

उत्तर

9

io_service::run() ऑपरेशन चलाएगा जब तक कि असीमित संचालन करने के लिए असर हो। यदि, किसी भी समय, कोई एसिंक्रोनस ऑपरेशंस लंबित नहीं है (या हैंडलर को बुलाया जा रहा है), run() कॉल वापस आ जाएगी।

हालांकि, कुछ डिज़ाइन हैं जो run() कॉल करना पसंद नहीं करते हैं जब तक कि सभी काम नहीं किए जाते हैं और io_service स्पष्ट रूप से निर्देश दिया गया है कि बाहर निकलना ठीक है। io_service::work के लिए इसका उपयोग किया जाता है। work ऑब्जेक्ट (मैं आमतौर पर इसे ढेर और साझा_प्टर पर करता हूं) बनाकर, io_service को हमेशा कुछ लंबित मानता है, और इसलिए run() विधि वापस नहीं आती है। एक बार जब मैं सेवा से बाहर निकलने में सक्षम होना चाहता हूं (आमतौर पर शटडाउन के दौरान), तो मैं कार्य ऑब्जेक्ट को नष्ट कर दूंगा।

+0

रीसेट() का उपयोग करने की तरह नष्ट करें? – lucastamoios

+2

आमतौर पर, यदि मैं काम करने के लिए shared_ptr का उपयोग करता हूं, तो हाँ, मैं shared_ptr पर 'रीसेट() 'को कॉल करता हूं। –

6

io_service::work, सभी काम करता है कि io_service का एक उदाहरण के लिए तैनात कर सकते हैं जब आप एक सॉकेट के साथ काम कर रहे हैं और एक अतुल्यकालिक पढ़ने शुरू उदाहरण के लिए, के आधार वर्ग है वास्तव में आप io_service करने के लिए एक work जोड़ रहे हैं। तो आप सामान्य रूप से work सीधे का उपयोग कभी नहीं, लेकिन इसके लिए एक अपवाद है:

io_service::run जैसे ही वहाँ ऐसा करने के लिए कोई और अधिक काम है के रूप में वापस आ जाएगी, इसलिए कुछ उत्पादक और उपभोक्ता धागे है कि एक आवेदन पत्र पर विचार, उत्पादकों कभी कभी काम करता है उत्पादन और उन्हें io_service::post के साथ उपभोक्ता धागे पर पोस्ट करें, लेकिन यदि सभी काम समाप्त हो गए हैं, तो io_service::run वापस आ जाएगा और संभवतः आपका उपभोक्ता धागा बंद हो जाएगा, इसलिए आपको io_service व्यस्त रखने के लिए मनमाने ढंग से काम करने की आवश्यकता है, इस मामले में आप सीधे io_service::work का उपयोग कर सकते हैं।

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