2012-02-13 10 views
9

के साथ संगत हैं, यूनिक्स वातावरण में makecontext()/swapcontext() फ़ंक्शन का परिवार कभी-कभी सी में कोरआउट को कार्यान्वित करने के लिए उपयोग किया जाता है। हालांकि ये फ़ंक्शन सीधे ढेर और निष्पादन प्रवाह में हेरफेर करते हैं। अक्सर जब सी से सी ++ में स्विच करते समय ये निम्न स्तर की कार्यक्षमता काफी अलग होती है।क्या मेकॉनटेक्स्ट()/swapcontext() फ़ंक्शन C++

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

+0

मैंने इन कार्यों के बारे में कभी नहीं सुना होगा। क्या आप जानते हैं कि [POSIX 2001] (http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html) पहले ही उन्हें धागे के पक्ष में अश्लील दिखाते हैं? –

+6

@ लार्समैन: एक करुणा। चीजें जो कोरआउट के साथ आसान हैं धागे के साथ बहुत कठिन हैं। हां, आप * थ्रेड के साथ कोरआउट को अनुकरण कर सकते हैं, लेकिन केवल ओवरहेड (सिंक्रनाइज़ेशन!) के साथ, और जब किसी अन्य समय अवरुद्ध होकर किसी भी समय थ्रेड चल रहा हो, तो वास्तव में यह नहीं है कि थ्रेडिंग का क्या अर्थ है। – celtschk

उत्तर

6

मैंने makecontext()/swapcontext() का उपयोग पहले से सी ++ कोड के साथ किया है, और जैसा कि आप कहते हैं, मुख्य बात अपवाद हैं। इसके अलावा मुझे कोई परेशानी नहीं है। मानक के अनुसार उनके अशुभता के बावजूद, वे अभी भी यूनिक्स जैसी ऑपरेटिंग सिस्टम द्वारा समर्थित हैं। (मैक ओएस एक्स के लिए एक चेतावनी है: #including से संबंधित शीर्ष शीर्षलेखों से पहले #define _XOPEN_SOURCE है।) उन्हें अप्रचलित बनाने के लिए तर्क बहुत लंगड़ा है, वे भी उन्हें एक pthreads- जैसे संस्करण के साथ बदल सकते हैं, जहां फ़ंक्शन पॉइंटर लेता है एक शून्य शून्य * तर्क।

जैसा कि आप कहते हैं, धागे उपयोगी विकल्प नहीं हैं, इसलिए मैं आगे बढ़ूंगा और swapcontext() का उपयोग करूंगा। आप कार्यों के अपने संस्करण को रोल करने के लिए this blog post भी दिलचस्प पा सकते हैं।

+0

दिलचस्प पोस्ट (हालांकि मुझे लगता है कि कोरआउट का सबसे अच्छा उपयोग शायद ठीक समय के टुकड़े या अल्पकालिक उदाहरणों के लिए नहीं है, इसलिए उल्लिखित ओवरहेड सबसे खराब मामला हो सकता है)। वैसे भी, बस यह जोड़ने के लिए कि मैं अपवाद फेंकने से बचता हूं और अन्यथा किसी [सी ++ प्रोजेक्ट] (http://code.google.com/p/crag/source/browse/ में मेक/स्वैपकोटेक्स्ट (और विंडोज़ फाइबर) का उपयोग करके कोई समस्या नहीं है। src/SMP/FiberPosix.cpp)। –

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