2012-10-02 16 views
31

मैं जहाँ मैं एक साझा संसाधन (मोशन प्रणाली), जो कई ग्राहकों द्वारा पहुँचा जा सकता है एक आवेदन पत्र है। मैं व्यक्तिगत संचालन कि इस कदम और जो की अवधि के लिए व्यवस्था करने के लिए उपयोग करने की आवश्यकता 'व्यस्त' अपवाद फेंक चाहिए परस्पर विरोधी आपरेशन एक ही समय में अनुरोध कर रहे हैं, तो की है। मेरे पास सीक्वेंसर भी हैं जिन्हें कई कार्रवाइयों के निष्पादन के लिए मोशन सिस्टम में विशेष पहुंच प्राप्त करने की आवश्यकता है, जो अन्य कार्यों के साथ छेड़छाड़ की जाती है; पूरे अनुक्रम के दौरान, कोई अन्य ग्राहक संचालन चलाने में सक्षम होना चाहिए।संसाधन async के साथ ताला लगा/इंतजार

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

मेरा प्रश्न: किसी को भी async/इंतजार कारण धागा स्विचिंग की उपस्थिति में विशेष उपयोग कर सकते प्राप्त करने से निपटने के लिए एक अच्छा पैटर्न के बारे में पता है?

संदर्भ के लिए, कुछ चीजें मैं माना जाता है:

  1. मुझे लगता है कि मार्शलों सभी अनुक्रमक एक दृश्य वापस एक एकल थ्रेड के लिए की अवधि के लिए कहता है एक कस्टम SynchronizationContext बना सकते हैं। मुझे अपने मौजूदा थ्रेड-एफ़िनिटी एक्सेस मैनेजमेंट कोड का पुन: उपयोग करने की अनुमति देने का लाभ है। नकारात्मकता यह है कि जब भी मैं अनुक्रम या ऑपरेशन करता हूं (क्योंकि ऑपरेशंस कई धागे भी फैल सकता है)।

  2. यह साबित करने के लिए ऑपरेशन विधियों को पास करने के लिए एक अधिग्रहण योग्य टोकन बनाएं अधिग्रहण का उपयोग यह टोकन पैरामीटर के साथ विधियों को फूला करने का नकारात्मक पक्ष है।

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

उत्तर

22

मेरा प्रश्न: किसी को भी async/इंतजार कारण धागा स्विचिंग की उपस्थिति में विशेष उपयोग कर सकते प्राप्त करने से निपटने के लिए एक अच्छा पैटर्न के बारे में पता है?

हाँ, आप AsyncLock, जो मेरे AsyncEx library के हिस्से के रूप में भी उपलब्ध है उपयोग कर सकते हैं। यदि आप "TryLock" प्रकार का ऑपरेशन चाहते हैं, तो आपको अपना खुद का आदिम बनाना होगा।

आप सुरक्षा जांच करने की कुछ क्षमता खो देते हैं: यह जांचने का कोई तरीका नहीं है कि वर्तमान में निष्पादित थ्रेड के पास विशिष्ट AsyncLock है या नहीं।

अन्य विकल्पों में ConcurrentExclusiveSchedulerPair (जो मैं here ब्लॉग करता हूं) या टीपीएल डेटाफ्लो शामिल करता हूं।

+0

मैं इसे उपयोगी पढ़ने के लिए उत्तर के रूप में चिह्नित करूंगा। अंततः अंतःस्थापित इंटरफेस के लिए प्रॉक्सी बनाने में समाप्त हुआ जिसमें एक्सेस चेक शामिल हैं। इसके बाद मैं एक विशेष डिस्पोजेबल 'अनन्य एक्सेस' प्रॉक्सी कर सकता हूं जो अन्य प्रॉक्सी उदाहरणों को सिस्टम के उपयोग से जीवित रहने से रोकता है। –

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