2012-10-14 12 views
6

के लिए कार्य-स्थानीय चर लागू करना मैं इसे अधिक असीमित बनाकर एक एप्लिकेशन (Win64, C++) में सुधार कर रहा हूं। मैं Concurrency रनटाइम का उपयोग कर रहा हूँ और यह अब तक मेरे लिए बहुत अच्छा काम किया है।Concurrency Runtime

एप्लिकेशन मूल रूप से डेटा की संख्या में 'नौकरियों' को निष्पादित करता है। प्रत्येक नौकरी के बारे में जानने के लिए, कुछ उप-सिस्टमों को कोड के साथ उपकरण के साथ वाद्य किया जाता है ताकि काम करने वाले कुछ संचालनों को ट्रैक किया जा सके। इससे पहले यह एक वैश्विक वैरिएबल का उपयोग करेगा जो वर्तमान में निष्पादित नौकरी का प्रतिनिधित्व करता है ताकि कॉलिंग श्रृंखला के नीचे संदर्भ जानकारी पास किए बिना ट्रैकिंग जानकारी पंजीकृत कर सकें। प्रत्येक नौकरी नौकरी को समानांतर करने के लिए कॉन्सआरटी का भी उपयोग कर सकती है। यह सब काफी अच्छी तरह से काम करता है।

हालांकि, मैं एप्लिकेशन को दोबारा कर रहा हूं ताकि हम समानांतर में शीर्ष-स्तरीय नौकरियों को निष्पादित कर सकें। प्रत्येक नौकरी को कॉन्सआरटी कार्य के रूप में निष्पादित किया जाता है, और यह उन सभी को छोड़कर सभी नौकरियों के लिए अच्छा काम करता है जिन्हें ट्रैकिंग की आवश्यकता होती है।

मुझे मूल रूप से आवश्यकता है कि कुछ संदर्भ जानकारी को कार्य के साथ संबद्ध करने का एक तरीका है, और उस कार्य द्वारा उत्पन्न किसी भी अन्य कार्यों में वह प्रवाह है। असल में, मुझे "कार्य स्थानीय" चर की आवश्यकता है।

ConcRT के साथ हम संदर्भ जानकारी संग्रहीत करने के लिए केवल थ्रेड स्थानीय लोगों का उपयोग नहीं कर सकते हैं, क्योंकि नौकरी ConcRT का उपयोग करके अन्य नौकरियों को जन्म दे सकती है और ये किसी भी धागे पर निष्पादित हो जाएंगी।

मेरे वर्तमान दृष्टिकोण में स्टार्टअप पर कई शेड्यूलर उदाहरण बनाना शामिल है, और उस नौकरी को समर्पित शेड्यूलर में प्रत्येक नौकरी को जन्म देना शामिल है। मैं फिर एक पूर्णांक आईडी पुनर्प्राप्त करने के लिए Concurrency::CurrentScheduler::Id() फ़ंक्शन का उपयोग कर सकता हूं जिसे मैं संदर्भ को समझने के लिए एक कुंजी के रूप में उपयोग कर सकता हूं। यह काम करता है लेकिन असेंबली में Concurrency::CurrentScheduler::Id() के माध्यम से सिंगल-स्टेपिंग मुझे कुछ हद तक समझता है क्योंकि यह कई वर्चुअल फ़ंक्शन कॉल और सुरक्षा जांच करता है जो काफी अधिक ओवरहेड जोड़ता है, जो कि एक समस्या है क्योंकि इस लुकअप को बेहद बेहद जरूरी है कुछ मामलों में उच्च दर।

तो क्या यह पूरा करने के लिए कुछ बेहतर तरीका है? मुझे प्रथम श्रेणी के टास्कलोकल/उपयोगकर्ताडेटा तंत्र होना पसंद होता जो मुझे एक मौजूदा संदर्भ सूचक को वर्तमान शेड्यूलर/शेड्यूलर समूह/कार्य के साथ जोड़ने की अनुमति देता था जिसे मैं बहुत कम ओवरहेड के साथ पुनर्प्राप्त कर सकता था।

जब भी एक कॉन्सआरटी थ्रेड एक नया काम पकड़ लेता है तो एक हुक जिसे मेरा आदर्श होगा, क्योंकि मैं शेड्यूलर/शेड्यूल ग्रुप आईडी पुनर्प्राप्त कर सकता हूं और इसे न्यूनतम एक्सेस ओवरहेड के लिए थ्रेड लोकल में स्टोर कर सकता हूं। हां, मैं ऐसे हुक को पंजीकृत करने का कोई तरीका नहीं देख सकता हूं और पीपीएल/एजेंटों के लिए कस्टम शेड्यूलर कक्षाओं को लागू करना संभव नहीं लगता है (this article देखें)।

उत्तर

0

क्या कोई कारण है कि आप इन कार्यों के लिए किसी प्रकार का संदर्भ ऑब्जेक्ट नहीं पारित कर सकते हैं जो उन्हें अपनी स्थिति अपडेट करने के लिए एक इंटरफेस देता है? क्योंकि जहां से मैं खड़ा हूं, ऐसा लगता है कि सिंगलटन (उर्फ ग्लोबल वैरिएबल) के साथ आपको वास्तव में एक बुरी समस्या है, जिसे एक निर्भरता इंजेक्शन के साथ हल किया जाना चाहिए।

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

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

+0

हां यह स्पष्ट समाधान है, और यह मूल रूप से हम अपने अधिकांश कोड के लिए करते हैं। हालांकि कोड के सबसेट के लिए, यह एक विकल्प नहीं है क्योंकि इससे अत्यधिक वर्बोजिटी हो जाएगी। असल में, हमारे पास सेटर्स/गेटर्स के साथ कोड-जनरेटेड डेटा ऑब्जेक्ट क्लास हैं। डेटा निर्भरताओं को ट्रैक करने के लिए गेटर्स को वैकल्पिक रूप से पंजीकृत करने के लिए उपकरण का उपयोग किया जा सकता है। इन सभी गेटर्स में संदर्भ वस्तुओं को पारित करना और सभी कॉल श्रृंखलाओं के संदर्भ को संदर्भित करना बहुत अजीब होगा। शेड्यूलर आईडी का मूल रूप से कार्यान्वयन करने के लिए शेड्यूलर-स्थानीय चर लागू करने के लिए अच्छा प्रदर्शन के साथ काम करता है। –

+0

@StefanBoberg: सिंगलटन के लिए एक वैकल्पिक मॉडल है जो वास्तव में सिंगलटन नहीं है। यह आपको मूल्यों को 'ढेर' करने की अनुमति देता है। आप स्टैक पर एक नया मान धक्का दे सकते हैं और यह सिंगलटन का मान बन जाता है जब तक कि मान पॉप नहीं हो जाता है और पुराना मान बहाल हो जाता है। आप इसे थ्रेड लोकल वैरिएबल के जरिए अपने पर्यावरण में अनुकूलित कर सकते हैं जिसे इस चर के मूल थ्रेड के उदाहरण के मान के साथ प्रारंभ किया गया था। – Omnifarious

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