आसान बनाने के लिए, यह एक स्थिति है जहाँ एक NamedPipe सर्वर एक NamedPipe ग्राहकब्रेकिंग ReadFile() अवरुद्ध - नामांकित पाइप (विंडोज एपीआई)
Windows API (WriteFile() का प्रयोग करके) पाइप के लिए लिखने के लिए इंतज़ार कर रहा है है कि ब्लॉक कर रहा है ReadFile है()
सर्वर अवरुद्ध साथ तुल्यकालिक पाइप (कोई ओवरलैप आई/ओ) बनाया गया है
ग्राहक जुड़े है सक्षम है, और अब सर्वर कुछ डेटा के लिए इंतजार कर रहा है।
चीजों के सामान्य प्रवाह में, क्लाइंट कुछ डेटा भेजता है और सर्वर इसे संसाधित करता है और फिर डेटा के अगले हिस्से की प्रतीक्षा करने के लिए ReadFile() पर वापस आता है।
इस बीच एक घटना होती है (उदाहरण के लिए उपयोगकर्ता इनपुट) और नामांकित पाइप सर्वर को अब कुछ अन्य कोड निष्पादित करना होगा, जो रीडफाइल() अवरुद्ध होने पर ऐसा नहीं कर सकता है।
इस बिंदु पर मुझे यह उल्लेख करने की आवश्यकता है कि नामांकित पाइप क्लाइंट मेरा आवेदन नहीं है, इसलिए मेरा इस पर कोई नियंत्रण नहीं है। मैं सर्वर को अनवरोधित करने के लिए इसे कुछ बाइट्स नहीं भेज सकता। यह बस वहां बैठने और कोई डेटा भेजने जा रहा है। चूंकि मेरे पास क्लाइंट कार्यान्वयन पर नियंत्रण नहीं है, इसलिए मैं उस अंत में कुछ भी नहीं बदल सकता।
एक समाधान एक अलग धागा बनाना होगा जिसमें सभी ReadFile() संचालन किए जाते हैं। इस तरह जब घटना होती है, मैं बस कोड को संसाधित कर सकता हूं। इसके साथ समस्या यह है कि ईवेंट को एक अलग थ्रेड की भी आवश्यकता होती है, इसलिए अब मेरे पास इस सर्वर के प्रत्येक इंस्टेंस के लिए दो अतिरिक्त थ्रेड हैं। चूंकि इसे स्केलेबल होने की आवश्यकता है, यह अवांछनीय है।
एक और धागाDisconnectNamedPipe()
और
CloseHandle()
वे दोनों नहीं लौटेगा बुला मैं कोशिश की है से
(जब तक ग्राहक पाइप के लिए लिखता है।)
मैं कनेक्ट नहीं कर सकता एक ही पाइप और कुछ बाइट्स लिखें क्योंकि:
"नाम के सभी उदाहरण पाइप एक ही पाइप नाम साझा करते हैं, लेकिन प्रत्येक उदाहरण में अपने स्वयं के बफर और हैंडल हैं, और क्लाइंट/सर्वर संचार के लिए एक अलग कंडिट प्रदान करता है। "
http://msdn.microsoft.com/en-us/library/aa365590.aspx
मैं इसे नकली करने का उपाय की जरूरत है, तो $ 64k डॉलर सवाल है:
मैं कैसे ReadFile को अवरुद्ध तोड़ सकते हैं()?
इनमें से कितने "सर्वर" उदाहरण करते हैं आपके पास? वे 10k तक के बारे में बात कर रहे हैं ... मुझे पता है कि ओवरहेड कम है, लेकिन विचार इसे कम करना है। मैं सिर्फ सवाल पूछ रहा हूं ... क्या यह संभव है? –
मुझे नहीं लगता कि आपके पास 10k धागे हो सकते हैं :-) – alex2k8
हां, जिसके लिए थ्रेड पूल की आवश्यकता होगी, लेकिन बिंदु यह है कि एक नया थ्रेड शुरू करने के साथ एक प्रदर्शन ओवरहेड है, और प्रत्येक थ्रेड को इसके ढेर के लिए कुछ स्मृति आवंटित की जाती है आदि यह जोड़ता है और अवांछनीय है। –