2012-11-01 24 views
5

मैं थोड़ा उलझन में हूं कि वास्तव में क्या होता है जब एक आईओ पूरा करने वाला बंदरगाह पूरा हो जाता है।क्या आईओ पूर्णता बंदरगाह पूरा होने से पहले या उसके बाद एक नया धागा उत्पन्न करता है रिपोर्ट करने के लिए कुछ है?

मुझे लगता है कि विन एपीआई एक आईओसीपी कतार तक पहुंच की इजाजत देता है कि किसी भी तरह एक विशिष्ट हैंडल के साथ कॉलबैक संदर्भ कतार (या ढेर) करने में सक्षम है (चलो एक सॉकेट कहें)। जब विंडोज एनआईसी से बाधा उत्पन्न करता है, तो यह किसी बिंदु पर एनआईसी के लिए आईओसीपी कतार में जाता है और पर अपने (आईओसीपी) थ्रेड पूल पर कॉलबैक निष्पादित करता है।

मेरा सवाल यह है कि, थ्रेड पूल से यह थ्रेड प्राप्त होने पर थ्रेड पूल से उत्पन्न होता है, या वास्तव में यह उत्पन्न होता है जब Win API को कॉल किया जाता है, तब तक प्रभावी रूप से प्रतीक्षा स्थिति में थ्रेड होता है आईओसीपी कतार द्वारा जागृत?

संपादित करें:
मैंने पाया इस: "जब भी है कि आपरेशन पूरा करता है, यह है कि मैं/O पूर्णता पोर्ट पर एक पैकेट कतार होगा बंदरगाह तो आगे बढ़ना और धागे में से एक का उपयोग करेगा:। http://msmvps.com/blogs/luisabreu/archive/2009/06/04/multithreading-i-o-and-the-thread-pool.aspx जहां राज्यों है आपके द्वारा निर्दिष्ट कॉलबैक चलाने के लिए पूल का धागा। "

+0

बस स्पष्टीकरण के लिए, यह एक प्रश्न है कि आईओओपी उपयोगकर्ता द्वारा प्रबंधित थ्रेड पूल में लाने के लिए आईओओ घटना अधिसूचनाओं * रिसेप्शन के स्वागत का प्रबंधन कैसे करता है? – WhozCraig

+0

नहीं। यह एक प्रश्न है कि आईओसीपी द्वारा बनाए गए धागे बंदरगाह के कुछ आईओ (इससे पहले कि वे अवरुद्ध हैं) से पहले बनाए गए हैं, या जब पोर्ट के पास कुछ आईओ रिपोर्ट करने के लिए धागे बनाए जाते हैं। – kasperhj

+0

यह स्पष्ट नहीं है कि आप किस बारे में बात कर रहे हैं। हस्तक्षेप ड्राइवर द्वारा संभाला जाता है। यह महत्वपूर्ण है कि आपका कोड GetQueuedCompletionStatus() या बाद में CreateThreadPoolIo() का उपयोग करता है या नहीं। पहले मामले में आप टीपी धागा बनाते हैं। आखिरी मामले में विंडोज़ इसे बनाता है जब ओवरलैप I/O पूरा हो जाता है। –

उत्तर

5

एक थ्रेड सुरक्षित कतार के रूप में एक आई/ओ समापन बंदरगाह के बारे में सोचना शायद आसान है कि ऑपरेटिंग सिस्टम पूरा होने पर ओवरलैप्ड ऑपरेशंस के परिणाम आपके लिए रखता है।

आप आईओसीपी बनाते हैं, फिर आप कुछ धागे बनाते हैं और ये धागे इस कतार से वस्तुओं को हटाने के लिए एक फ़ंक्शन को कॉल करते हैं। आम तौर पर यह GetQueuedCompletionStatus() है। यह फ़ंक्शन अनिवार्य रूप से आपके थ्रेड को अवरुद्ध करता है जब तक कि IOCP (कतार) में कुछ न हो और फिर आपके थ्रेड को कुछ और चलाने के लिए अनुमति दें।

आप आईओसीपी के साथ फ़ाइल हैंडल और सॉकेट को जोड़ते हैं और इसका मतलब यह है कि एक बार उनके ओवरलैप्ड पूर्ण होने से आपके लिए आईओसीपी (कतार) में रखा जाएगा।

यह उससे अधिक जटिल है, लेकिन इस तरह से आपको सोचना चाहिए।

+0

बस स्पष्ट करने के लिए। मेरे आवेदन में, मैं अपना _own_ थ्रेड पूल बना देता हूं, और थ्रेड पूल थ्रेड को आईओसीपी में पास करता हूं जिसे तब तक आईओसीपी द्वारा अवरुद्ध किया जाता है जब तक कि कुछ पूरा नहीं हो जाता? यह समझना मुश्किल है क्योंकि यह वास्तव में कैसे काम करता है इस पर विभिन्न "राय" लगता है, उदा। मेरा संपादन देखें। – kasperhj

+0

आपके पूल में धागे आईओसीपी पर काम के लिए इंतजार कर रहे हैं, बाकी सब कुछ मेरे उत्तर में बताए गए जैसा ही है। पूल कैसे रखता है धागे की संख्या को बदलने का फैसला करता है आईओसीपी से संबंधित किसी भी तरह से नहीं है। यह निगरानी करने में सक्षम हो सकता है जब उसके धागे GetQueuedCompletionStatus() को कॉल करते हैं और यदि वर्तमान में कोई भी नहीं है और कुछ टाइमआउट समाप्त हो जाता है तो यह अधिक थ्रेड बना सकता है और फिर वे आईओसीपी पर काम के लिए इंतजार कर रहे हैं। मुझे थ्रेड पूल के कार्यान्वयन को नहीं पता है, इसलिए मैं और नहीं कह सकता। –

+0

मान लीजिए कि मैं यूआईएलपी को यूआई थ्रेड पर कॉल करता हूं, यह तब तक अवरुद्ध होगा जब तक कि मुझे अपना आईओसीपी पैकेट नहीं मिलता? क्या आपके पास आईओसीपी आंतरिक का संदर्भ है? – kasperhj

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