2011-03-19 6 views
5

लगता है कि सभी उदाहरण हमेशा सभी धागे में एक ही io_service चलाने को दिखाते हैं।बढ़ावा :: एएसओ थ्रेड में विभिन्न सेवाओं को शुरू कर रहा है?

क्या आप एकाधिक io_services शुरू कर सकते हैं? यहाँ मैं क्या करना चाहते हैं क्या है: उपयोगकर्ता इनपुट से निपटने के लिए मुख्य थ्रेड में

प्रारंभ io_service एक ...

प्रारंभ एक और धागा में एक और io_service बी है कि तब कार्यकर्ता धागे सभी साझा करने का एक समूह शुरू कर सकते हैं io_service बी

io_service ए पर उपयोगकर्ता io_service बी पर "पोस्ट" काम कर सकते हैं ताकि यह कार्यकर्ता पूल पर किया जा सके लेकिन io_service ए, यानी मुख्य धागा पर कोई काम नहीं किया जाना चाहिए।

क्या यह संभव है? इसका कोई मतलब भी है क्या?

धन्यवाद

उत्तर

1

अच्छा सवाल!

हाँ, यह संभव एक के लिए है। एक आवेदन में मैं वर्तमान में काम कर रहा हूं, मैंने सिस्टम के विभिन्न पहलुओं के लिए जिम्मेदार अलग-अलग घटकों में एप्लिकेशन को तोड़ दिया है। प्रत्येक घटक अपने धागे में चलता है, इसमें टाइमर का अपना सेट होता है, यह अपने स्वयं के नेटवर्क I/O को एएसओ का उपयोग करता है। एक टेस्टेबिलिटी/डिज़ाइन परिप्रेक्ष्य से, यह मेरे लिए अधिक साफ दिखता है, क्योंकि कोई भी घटक दूसरे के साथ हस्तक्षेप नहीं कर सकता है, लेकिन मुझे सही होने का खतरा है। मुझे लगता है कि मैं एक पैरामीटर के रूप में आईओ सेवा में गुजरने वाली हर चीज को फिर से लिख सकता हूं, लेकिन वर्तमान में ऐसा करने की आवश्यकता नहीं मिली है।

तो वापस अपने प्रश्न के लिए आ रहा है, तो आप आप जो कुछ भी चाहते हैं कर सकते हैं, IMO इसे और अधिक इसे आज़माने और इसे बदलने के लिए यदि आप कोई समस्या आने पर का मामला है।

इसके अलावा

, तुम क्या सैम मिलर एक अलग पोस्ट WRT उपयोगकर्ता से निपटने इनपुट में बताया है (अर्थात आप एक कंसोल का उपयोग कर रहे हैं) पर एक नज़र लेने के लिए चाहते हो सकता है:, https://stackoverflow.com/questions/5210796/boost-asio-how-to-write-console-server

+0

+1 पॉज़िक्स :: stream_descriptor उपयोग दिखाते हुए मेरे उत्तर को जोड़ने के लिए +1। –

2

मेरे अनुभव में यह वास्तव में आवेदन पर निर्भर करता है यदि io_service प्रति सीपीयू या एक प्रति प्रक्रिया बेहतर प्रदर्शन कर रही है। इस विषय पर कुछ साल पहले asio-users मेलिंग सूची पर एक चर्चा हुई थी।

Boost.Asio प्रलेखन कुछ महान उदाहरण HTTP सर्वर 2 और HTTP सर्वर 3 उदाहरण में showing these two तकनीक है। लेकिन ध्यान रखें कि दूसरा HTTP सर्वर सिर्फ यह दिखाता है कि इस तकनीक का उपयोग कैसे करें, इसका उपयोग कब या क्यों नहीं किया जाए। आपके आवेदन को प्रोफाइल करके उन प्रश्नों का उत्तर देने की आवश्यकता होगी।

सामान्य तौर पर, आप जब Boost.Asio

  1. एकल सीपीयू आत्मीयता
  2. किसी प्रकार के साथ एक एकल io_service
  3. एकाधिक साथ
  4. थ्रेड पूल पिरोया io_service वस्तुओं का उपयोग कर अनुप्रयोग बनाने निम्न क्रम का उपयोग करना चाहिए
+0

+1 दिलचस्प चर्चा :), मुझे अपने सिस्टम डिज़ाइन के बारे में आश्चर्य है हालांकि मुझे अभी तक कोई समस्या नहीं मिली है। – Ralf

+0

यहां स्थिति है, मेरे पास एक ऐसा एप्लिकेशन है जिसमें एक थ्रेड और एक io_service है जो सॉकेट और स्टेडियो को संभालती है, यह पुराने गैर-थ्रेड सेव कोड है।अब मैं एक वर्कर थ्रेड पूल जोड़ना चाहता हूं जिसमें इसका अपना io_service है और मुख्य थ्रेड पर गैर-थ्रेड सुरक्षित कोड से बातचीत नहीं करेगा। कार्यकर्ता पूल अलग-अलग डेटा पर कुछ अलग कोड चलाएगा और संचार मुख्य io_service और थ्रेड पूल में चलने वाले io_service के बीच io_service पोस्ट के माध्यम से होगा। ऐसा लगता है कि किया जा सकता है? –

+0

@ ओलिवर हां, ऐसा लगता है जैसे यह किया जा सकता है। हालांकि, अगर यह मेरा काम था, तो मैं गैर-थ्रेड सुरक्षित कोड को स्ट्रैंड के साथ ठीक कर दूंगा और io_service :: run() का आह्वान करने वाले धागे के पूल के साथ एक एकल io_service का उपयोग करूंगा। –

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