2011-12-19 12 views
8

के साथ थ्रेड सुरक्षित कोरआउट्स क्या कोई तरीका है कि मैं बूस्ट :: एएसओओ के साथ थ्रेड-सुरक्षित कोरआउटिन रख सकता हूं?एएसओ

मुझे एकाधिक धागे पर चलने के लिए एक io_service चाहिए और मेरे कुछ हैंडलर कोरआउट हैं।

Boost.Coroutine एक समाधान हो करने के लिए प्रतीत होता है, लेकिन वे document है कि वे एक coroutine कि एक अलग थ्रेड में शुरू किया गया था शुरू करने का समर्थन नहीं करते।

जहाँ तक मुझे पता के रूप में केवल दो इस समस्या का समाधान संभव नहीं है:

  1. coroutines प्रयोग न करें। अधिक वर्बोज़ (यहां तक ​​कि लैम्ब्डा के साथ) का प्रयोग करें, लेकिन राज्य को स्टोर करने वाले कॉलबैक को चेन करने की समान रूप से कार्यात्मक विधि का उपयोग करें।
  2. प्रत्येक हैंडलर को केवल एक थ्रेड में चलाने के लिए मजबूर करें। मुझे पता है कि प्रत्येक थ्रेड के लिए बस एक अलग io_service है। एक तरफ के रूप में, क्या एक आसान तरीका है, io_service :: स्ट्रैंड के समान, हैंडलर के एक सेट को उसी धागे में चलाने के लिए मजबूर करने के लिए?

किसी भी तरह से अच्छे समाधान नहीं हैं। एक समाधान में मैं कोरआउट को खो देता हूं। दूसरी तरफ मैं अपनी बहुसंख्यक क्षमता खो देता हूं।

+1

FYI: क्या आपने http://blog.think-async.com/2009/08/secret-sauce-revealed.html और http://blog.think-async.com/2010/03/potted- गाइड-टू-स्टैकलेस-coroutines.html? – Ralf

+0

@ राल्फ हाँ मैंने देखा है, यही कारण है कि मैं इस सवाल से पूछ रहा हूं। एक बहुत अच्छा विचार लगता है, और एसिंक्रोनस कोड लिखने का एक आसान तरीका लगता है। – Lalaland

उत्तर

3

ऐसा लगता है कि इस समस्या का कोई आसान समाधान नहीं है।

मुख्य दोष समस्या शायद इस तथ्य के कारण है कि सी ++ किसी फ़ंक्शन में होने वाली अधिकांश चीज़ों को पुन: व्यवस्थित करने की अनुमति देता है। इस प्रकार आप कार्यों में होने वाली चीजों के क्रम पर विश्वसनीय रूप से निर्भर नहीं हो सकते हैं।

ऐसा लगता है कि मुझे कॉलबैक की एक श्रृंखला का उपयोग करके समाप्त करना होगा, संभवत: लैम्ब्डा का उपयोग करके अगर मुझे कोड के ब्लॉक की तरह सबकुछ दिखने की इच्छा है।

शायद मैं मैक्रोज़ का उपयोग करके कुछ भी हैक कर सकता हूं जो कोरआउट शैली को अनुकरण करने के लिए लैम्ब्डा को हल करता है।

+0

एफवाईआई, कॉलबैक कोरआउट के लिए एक उत्कृष्ट ड्राइवर हैं यदि कोई कोरआउट लाइब्रेरी है जो कॉलबैक के अंदर से बाकी कोरआउटिन चलाती है (https://code.google.com/p/libglim/source/browse/trunk/test_cbcoro .cc)। – ArtemGr

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