2009-05-27 13 views
5

क्या एकाधिक इनपुट पर प्रतीक्षा करने का एक अनुशंसित तरीका है। उदाहरण के लिए, मैं चाहता हूं कि मेरा प्रोग्राम 3 स्रोतों से इनपुट प्राप्त करने में सक्षम हो:एकाधिक घटनाओं पर प्रतीक्षा करना C++

थ्रेड स्थिति पर सुनें उदा। pthread_cond_wait()

मानक इनपुट से डेटा लें उदा। getline()

सॉकेट पर सुनें उदा। स्वीकार करें()

इसे पूरा करने का सबसे अच्छा तरीका क्या है? क्या मुझे प्रत्येक अलग इनपुट स्रोत के लिए धागा चाहिए? धन्यवाद

+0

हां इसका कारण शायद अनावश्यक है। मुझे मुख्य थ्रेड केवल हालत पर इंतजार करना चाहिए। सॉकेट और फ़ाइल इनपुट पर प्रतीक्षा करने के लिए चयन() का उपयोग करके एक "बाहरी इनपुट" धागा। फिर दोनों बच्चे धागे और "बाहरी इनपुट" थ्रेड स्थिति का उपयोग कर मुख्य धागे को उत्तेजित कर सकते हैं। –

उत्तर

4

select(2) सिस्टम कॉल का उपयोग करके आप एकाधिक धागे का उपयोग किए बिना फ़ाइल डिस्क्रिप्टर पर सुन सकते हैं। आप एक टाइमआउट के साथ एक शर्त चर पर प्रतीक्षा करने के लिए pthread_cond_timedwait का उपयोग कर सकते हैं, जैसे कि आप किसी विशेष समय से अधिक प्रतीक्षा नहीं करते हैं।

मुझे लगता है कि एक शर्त चर या किसी प्रकार के फ़ाइल डिस्क्रिप्टर पर एक साथ प्रतीक्षा करना बेहद असामान्य है - यदि आप पूरी तरह से सुनिश्चित हैं कि आप यही करना चाहते हैं, तो आपको एकाधिक धागे का उपयोग करना होगा , एक थ्रेड के साथ pthread_cond_wait/pthread_cond_timedwait, और अन्य धागा select या कुछ अन्य I/O फ़ंक्शन को कॉल कर रहा है।

+8

यह असामान्य है क्योंकि आप यूनिक्स पर यह (आसानी से) नहीं कर सकते हैं। यह Win32 में बहुत आम है, जहां कई चीजों (सॉकेट हैंडल, थ्रेड कतार, सेमफोर, व्हाट्नॉट) पर प्रतीक्षा करना कोई ब्रेनर नहीं है। – nos

0

यह निश्चित रूप से ऐसा लगता है कि ये तीन अलग-अलग संदेश विकल्प एक थ्रेड के लिए पारस्परिक रूप से अनन्य हैं; थ्रेड की स्थिति की प्रतीक्षा करते समय एक धागा stdin से कैसे पढ़ सकता है?

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

7

accept(2) और stdin के लिए अलग थ्रेड की कोई आवश्यकता नहीं है - यहां poll/select का उपयोग करें। सशर्त चर के बजाय, थ्रेड के बीच एक पाइप बनाएं (यदि आपके पास सीवी के बारे में बात है तो आपके पास पहले से ही धागे हैं), उसी poll पर प्रतीक्षा करें और ईवेंट होने पर इसे लिखें।

3

आधुनिक लिनक्स पर ऐसा करने का सबसे अच्छा तरीका pthread_cond_wait का उपयोग नहीं करना है। इसके बजाय eventfd का उपयोग करें, जो आपको चुनिंदा/मतदान/एपोल का उपयोग करके कई कार्यक्रमों को सुनने में सक्षम बनाएगा।

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