2010-09-13 11 views
5

मेरे पास सी ++ में लिखी एक असीमित डेटाफ्लो प्रणाली है। डेटाफ्लो आर्किटेक्चर में, एप्लिकेशन घटक उदाहरणों का एक सेट है, जिसे स्टार्टअप पर प्रारंभ किया जाता है, फिर वे एक दूसरे को प्री-डिफ़ाइंड संदेशों के साथ संवाद करते हैं। पुलसर नामक एक घटक प्रकार है, जो अन्य घटकों को "घड़ी संकेत संदेश" प्रदान करता है जो इसे एक से कनेक्ट करता है (उदा। देरी)। यह प्रत्येक एक्स एमएस संदेश (डेटाफ्लो डिस्पैचर एपीआई को कॉल करता है) कहता है, जहां एक्स "फ्रीक्वेंसी" पैरामीटर का मान है, जो एमएस में दिया जाता है।ए में एक फ़ंक्शन (सी/सी ++) कॉल करने का आधिकारिक तरीका क्या है। लिनक्स पर हर 1/100 सेकंड?

छोटा, कार्य केवल प्रत्येक एक्स एमएस में एक फ़ंक्शन (विधि) को कॉल करने के लिए है। सवाल यह है कि ऐसा करने का सबसे अच्छा/आधिकारिक तरीका क्या है? क्या इसके लिए कोई पैटर्न है?

  • उपयोग SIGALRM:

    कुछ तरीकों मैंने पाया हैं। मुझे लगता है, सिग्नलिंग उस उद्देश्य के लिए उपयुक्त नहीं है। Altough, संकल्प 1 सेकंड है, यह बहुत दुर्लभ है।

  • एचडब्ल्यू इंटरप्ट का उपयोग करें। मुझे इस सटीकता की आवश्यकता नहीं है। इसके अलावा, मुझे एचडब्ल्यू से संबंधित समाधान का उपयोग करने के बारे में पता है (सर्वर कई प्लेटफार्मों के लिए संकलित है, उदाहरण के लिए एआरएम)।
  • अगली कॉल तक समय बीतें, और सोएं()। मुझे यकीन नहीं है कि 5 थ्रेड द्वारा समय से संबंधित सिस्टम कॉल कॉल करने के लिए समय मापने का सबसे अच्छा तरीका है, हर सेकेंड में प्रत्येक 10 बार - लेकिन शायद मैं गलत हूं।
  • रीयलटाइम कर्नेल फ़ंक्शन का उपयोग करें। मुझे इसके बारे में कुछ नहीं पता। इसके अलावा, मुझे क्रिस्टल सटीक कॉल की आवश्यकता नहीं है, यह एक परमाणु नहीं है, और मैं कुछ प्लेटफॉर्म पर आरटी कर्नेल स्थापित नहीं कर सकता (भी, 2.6.x कर्नेल उपलब्ध है)।

शायद, सबसे अच्छा जवाब एक ऑडियो/वीडियो प्लेयर के स्रोत कोड (जिसे मैं स्वयं नहीं ढूंढ/समझ सकता हूं) का संक्षिप्त टिप्पणी है।

अद्यतन (@MSalters द्वारा अनुरोध किया गया): डीएफ प्रोजेक्ट के सह-लेखक मैक ओएसएक्स का उपयोग कर रहे हैं, इसलिए हमें एक समाधान मिलना चाहिए जो अधिकांश पॉक्सिक्स-कंपिलेंट सेशन पर काम करता है। सिस्टम, न केवल लिनक्स पर। शायद, भविष्य में एक लक्षित उपकरण होगा जो बीएसडी, या कुछ प्रतिबंधित लिनक्स का उपयोग करता है।

+3

आपके आरक्षण के बावजूद एक संकेत उपयुक्त है। 'मैन सेटिटिमर' की जांच करें, इसे जाने दें, और अगर आपको वास्तविक समस्याएं हैं तो हमें बताएं। यदि आप पहले से ही कुछ (जैसे) में अवरुद्ध कर रहे हैं, तो आप इसके बजाय टाइमआउट मान का उपयोग कर सकते हैं। –

+0

मल्टीथ्रेड ऐप के लिए अच्छी पसंद सिग्नल कर रहा है? जब एक संकेत आता है, तो इसे एप्राइपिएट थ्रेड में "प्रेषित" होना चाहिए। – ern0

+0

सिग्नल मास्क प्रति थ्रेड हैं, इसलिए आप हर दूसरे धागे में 'SIGALRM' को अवरुद्ध कर सकते हैं। – caf

उत्तर

2

ईमानदार होने के लिए, मुझे लगता है कि एक एसिंक्रोनस डेटाफ्लो सिस्टम होने का दावा करने के लिए एक "पलसर" होना चाहिए। या तो यह असीमित है या इसमें एक सिंक्रनाइज़िंग घड़ी घटना है।

यदि आपके पास कोई घटक है जिसके लिए देरी की आवश्यकता है, तो इसे boost::asio::deadline_timer.async_wait या निम्न स्तर के समाधान (चयन()/epoll()/timer_create()/आदि) के माध्यम से अनुरोध करें। किसी भी तरह से, सबसे प्रभावी सी ++ समाधान शायद boost.asio टाइमर है, क्योंकि वे आपके लिनक्स कर्नेल संस्करण पर सबसे अधिक कुशलता का उपयोग करेंगे।

+0

मैं बूस्ट और न ही किसी अन्य libs का उपयोग नहीं करता (केवल: stdlib, pthreads)। हम डिजाइन पर एक तर्क खोल सकते हैं; मेरा लक्ष्य डिस्पैचर को रखना था (कभी-कभी ब्रोकर, शेड्यूलर भी कहा जाता है) जितना कमजोर हो सकता है, यही कारण है कि पुलसर एक अलग घटक है। शायद, एक दिन प्रेषक टाइमर कार्यों/सेवाओं को प्रदान करेगा, लेकिन यह पलसर खिलाएगा। पहले से ही अन्य विशेष डिस्पैचर फ़ंक्शंस हैं, जो घटकों के माध्यम से सुलभ हैं (उदाहरण के लिए: संदेश ऑर्डरिंग)। कहना है, कि मेरा सिस्टम "प्रोटोटाइप" राज्य में है: यह काम करता है, लेकिन करने के लिए बहुत सी चीज है। – ern0

+2

ठीक है, जहां तक ​​डिज़ाइन जाता है, मैं timer_create()/timer_settime() के साथ जाऊंगा। Timer_create के लिए sigev_notify में SIGEV_THREAD डालना न भूलें, ताकि यह प्रक्रिया के बजाय थ्रेड में टाइमर समाप्ति प्रदान कर सके। यह "आधिकारिक सी ++ रास्ता" नहीं होगा, लेकिन यह "आधिकारिक पॉज़िक्स तरीका" होगा। – Cubbi

+0

मुझे नहीं पता था कि सिग्नल इतने थ्रेड-फ्रेंडली हैं, मैं इसे आज़माउंगा। – ern0

3

यदि आपको हार्ड रीयल-टाइम गारंटी की आवश्यकता नहीं है, तो usleep नौकरी करना चाहिए। यदि आप हार्ड रीयल-टाइम गारंटी चाहते हैं तो एक इंटरप्ट आधारित या रीयलटाइम कर्नेल आधारित फ़ंक्शन आवश्यक होगा।

+2

नींद अप्रचलित है, आपको नैनोस्लीप का उपयोग करना चाहिए या – aeh

+0

का चयन करना चाहिए नैनोस्लीप ठंडा है, यह शेष समय पर बाधा के बारे में बताता है, लेकिन मुझे नींद की मात्रा को सही करने के लिए हर दौर में एक बार पढ़ने का फ़ंक्शन कॉल करने की आवश्यकता है, और मैं नहीं चाहता । – ern0

2

पहले उल्लिखित दृष्टिकोणों का एक विकल्प लिनक्स कर्नेल 2.6.25+ में Timer FD समर्थन का उपयोग करना है ("वर्तमान" के करीब जो भी वितरण है)। टाइमर एफडी पिछले दृष्टिकोण की तुलना में थोड़ा अधिक लचीलापन प्रदान करते हैं।

+0

हाँ, यह बहुत अच्छा है! लेकिन मैं बीएसडी संगतता को छोड़ना नहीं चाहता (मेरा दोस्त, जो इस परियोजना में सह-लेखक है, मैक का उपयोग कर रहा है, दुर्भाग्य से)। – ern0

+0

@ ern0: कृपया इस तरह की चिंताओं को प्रश्न में जोड़ें! – MSalters

1

डिजाइन के प्रश्न की उपेक्षा (जो मुझे लगता है कि एक दिलचस्प सवाल है, लेकिन अपनी ही धागा हकदार) ...

मैं एक 'बाधा' विचार को डिजाइन करने, और संकेत या कुछ गिरी फ़ंक्शन का उपयोग करके शुरू होगा हर एक्स usec को बाधित करने के लिए। जब तक कि अन्य विचार बहुत दर्दनाक न हों तब तक मैं नींद-कार्य करने में देरी करूंगा।

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