समर्पित थ्रेड लॉकिंग ऑब्जेक्ट के लिए नामकरण कन्वेंशन [बंद]


16

एक अपेक्षाकृत मामूली सवाल है, लेकिन मैं इस पर आधिकारिक प्रलेखन या यहां तक ​​कि ब्लॉग की राय / चर्चा नहीं पा सका हूं।

सीधे शब्दों में कहें: जब मेरे पास एक निजी वस्तु है जिसका एकमात्र उद्देश्य निजी सेवा करना है lock, तो मुझे उस वस्तु का क्या नाम देना चाहिए?

class MyClass
{
    private object LockingObject = new object();

    void DoSomething()
    {
        lock(LockingObject)
        {
            //do something
        }
    }
}

हमें LockingObjectयहां क्या नाम देना चाहिए ? इसके अलावा न केवल चर के नाम पर विचार करें, लेकिन लॉक करते समय यह इन-कोड कैसे दिखता है।

मैंने विभिन्न उदाहरण देखे हैं, लेकिन सलाह देने के लिए कोई ठोस नहीं है:

  1. SyncRoot(और जैसे विविधताओं _syncRoot) के बहुत सारे उपयोग ।

    • कोड नमूना: lock(SyncRoot) ,lock(_syncRoot)
    • यह VB के समकक्ष से प्रभावित प्रतीत होता है SyncLock कथन से , जो SyncRootसंपत्ति कुछ ICollection वर्गों और कुछ प्रकार के SyncRoot डिजाइन पैटर्न का हिस्सा है (जो यकीनन एक बुरा विचार है) पर मौजूद है
    • C # संदर्भ में होने के नाते, सुनिश्चित नहीं है कि मैं VBish नामकरण करना चाहता / चाहती हूं। इससे भी बदतर, VB में चर का नामकरण खोजशब्द के समान है। निश्चित नहीं है कि यह भ्रम का स्रोत होगा या नहीं।
  2. thisLockऔर lockThisMSDN लेखों से: C # लॉक स्टेटमेंट , VB SyncLock स्टेटमेंट

    • कोड नमूना: lock(thisLock) ,lock(lockThis)
    • सुनिश्चित नहीं हैं कि उदाहरण के लिए इनका नाम शुद्ध रूप से रखा गया था या नहीं
    • अजीब तरह की अगर हम एक के भीतर इस का उपयोग कर रहे हैं static वर्ग / विधि के ।
    • EDIT: ताले पर विकिपीडिया लेख भी इस उदाहरण के लिए नामकरण का उपयोग करता है
  3. एक PadLockअलग आवरण के कई उपयोग

    • कोड नमूना: lock(PadLock) ,lock(padlock)
    • बुरा नहीं है, लेकिन मेरा एकमात्र गोमांस है जो कि अनजाने में एक भौतिक "पैडलॉक" की छवि को आमंत्रित करता है जिसे मैं अमूर्त थ्रेडिंग अवधारणा के साथ नहीं जोड़ता हूं ।
  4. लॉक का नामकरण उस चीज़ पर आधारित है जिसे लॉक करने का इरादा है

    • कोड नमूना: lock(messagesLock) ,lock(DictionaryLock) ,lock(commandQueueLock)
    • VB SyncRoot MSDN पृष्ठ उदाहरण में, यह एक है simpleMessageList एक निजी messagesLockऑब्जेक्ट के साथ एक उदाहरण है
    • मुझे नहीं लगता कि आप जिस प्रकार ("DictionaryLock") को लॉक कर रहे हैं, उस प्रकार के विरुद्ध लॉक को नाम देना अच्छा है क्योंकि यह एक कार्यान्वयन विवरण है जो बदल सकता है। मैं उस कॉन्सेप्ट / ऑब्जेक्ट का नामकरण पसंद कर रहा हूं, जिसे आप लॉक कर रहे हैं ("मैसेजसॉक" या "कमांडक्यूयू लॉक")
    • दिलचस्प है, मैं कोड नमूने में वस्तुओं को ऑनलाइन या StackOverflow पर लॉक करने के लिए इस नामकरण सम्मेलन को बहुत कम देखता हूं ।
  5. (EDIT) सेक्शन "8.12 द लॉक स्टेटमेंट" के तहत C # कल्पना में इस पैटर्न का एक उदाहरण है और इसे नाम दिया गया है synchronizationObject

    • कोड नमूना: lock(SynchronizationObject) ,lock(synchronizationObject)

प्रश्न: आपकी राय क्या है आम तौर पर नामकरण के बारे में निजी लॉकिंग वस्तुओं?

हाल ही में, मैंने उनका नामकरण शुरू किया है ThreadLock(जैसे कि विकल्प 3 की तरह), लेकिन मैं खुद को उस नाम पर सवाल उठा रहा हूं।

मैं अपने अनुप्रयोगों में अक्सर इस लॉकिंग पैटर्न (ऊपर दिए गए कोड नमूने में) का उपयोग कर रहा हूं, इसलिए मैंने सोचा कि उनके लिए एक ठोस नामकरण सम्मेलन के बारे में अधिक पेशेवर राय / चर्चा प्राप्त करने के लिए यह समझ में आ सकता है। धन्यवाद!

जवाबों:


4

मैंने इसे कॉल करने की आदत के लिए ले लिया है, SomeResourceLockजहाँ SomeResourceआपको लॉक / एक्सेस करने की आवश्यकता है, यानी (किसी भी थ्रेड मुद्दे को माफ करें, यह सिर्फ एक उदाहरण है)

public class ProcessDataInQueue
{
    private static Queue<Data> _dataQueue = new Queue<Data>();
    private static object _dataQueueLock = new Object();

    public void AddOneItem(Data itemToAdd)
    {
        lock(_dataQueueLock)
        {
            _dataQueue.Enqueue(itemToAdd);
        }
    }

    public void ProcessOneItem()
    {
        Data itemToProcess = null;
        lock(_dataQueueLock)
        {
            itemToProcess = _dataQueue.Dequeue();
        }
        // ... process itemToProcess
    }
}

मैं कक्षाओं के बाद इस आदत पर आया हूं जहां मेरे पास विभिन्न संसाधनों के लिए कई ताले हो सकते हैं, इसलिए मैं लॉकिंग ऑब्जेक्ट को उन संसाधनों के आधार पर नाम देता हूं जिनके लिए यह लॉकिंग एक्सेस है। कभी-कभी एक ऑब्जेक्ट कई संसाधनों को लॉक कर सकता है, जिस स्थिति में मैं नामों को सम्मान देने की कोशिश करूंगा कि किसी तरह से, इसलिए पाठक को पता है "उन व्यक्तिगत संसाधनों के लिए अन्य लॉक इस लॉक के साथ ही विवाद में होंगे"।


2
मुझे लगता है कि यह भ्रामक है, क्योंकि SynchronizationContextकुछ काफी अलग है।
18

1
@svick पूरी तरह से संभव है कि मैं इस शब्द का दुरुपयोग कर रहा हूं, फिर भी मुझे लगता है कि संसाधन के लॉक होने के बारे में विशिष्ट होना महत्वपूर्ण है लेकिन अगर यह अधिक समझ में आता है, तो मैं इसे "SynchronizationContext" के स्थान पर "लॉक" शब्द का सुझाव देने के लिए संपादित करूंगा।
जिमी हॉफ

6

मैं आमतौर पर इसे कॉल करता हूं locker, लेकिन चूंकि यह निजी है, मेरा मानना ​​है कि यह कुछ हद तक महत्वहीन कार्यान्वयन विवरण है। अंगूठे का पहला नियम, अपनी टीम / कंपनी के मानकों का उपयोग करें। यदि कोई नहीं है, तो ठीक है, कृपया एक बनायें और उसका उपयोग करें, लेकिन इसे बनाने में, चीजों को सरल रखें। यदि आपकी कक्षा में एकल लॉकिंग ऑब्जेक्ट है, तो इसे कॉल करना fooकाफी अच्छा है। यदि आपके पास कई हैं, तो व्यवसाय का एक अच्छा क्रम बस उस वर्ग के डिजाइन को फिर से देखना हो सकता है, यह देखने के लिए कि क्या यह बहुत अलग चीजें कर रहा है। लेकिन, यदि नहीं, तो नाम महत्वपूर्ण हो जाता है, क्योंकि इस पूरी तरह से उदाहरण में:

public sealed class CustomerOrders
{
    private readonly object customerLocker = new object();

    private readonly object orderLocker = new object();

    public IEnumerable<Customer> Customers
    {
        get
        {
            lock (this.cutomerLocker)
            lock (this.orderLocker)
            {
                // stuff...
            }
        }

        set
        {
            lock (this.cutomerLocker)
            lock (this.orderLocker)
            {
                // other stuff...
            }
        }
    }

    public IEnumerable<Order> Orders
    {
        get
        {
            lock (this.orderLocker)
            {
                // stuff...
            }
        }

        set
        {
            lock (this.cutomerLocker)
            {
                // different stuff...
            }
        }
    }
}

2
मैं पूरी तरह से एक नामकरण शैली के साथ कम या ज्यादा लॉकिंग तंत्र के लिए सहमत हूं। मेरे पास भी इस शैली के समान कुछ था जब मैंने दो लॉकरों के साथ एक वर्ग लागू किया था (बाद में इसे दूर कर दिया)
क्रिस सिनक्लेयर

2

मैंने हमेशा lck_ का उपयोग किया। इस तरह अगर आप ctrl + f 'lck' करते हैं, तो आपको केवल लॉक ढूंढने चाहिए जबकि 'लॉक' में भी 'घड़ी' जैसी चीजें मिलेंगी।

लॉकटिस और पैडलॉक जैसी चीजें यूनी पोर्टफोलियो के लिए ठीक हैं लेकिन उचित परियोजनाओं के लिए आपको वास्तव में सिमेंटिक नामों का उपयोग करना चाहिए ताकि जब आप घोषणाओं को देखें तो आपको पता चले कि ऑब्जेक्ट वास्तव में कोड के माध्यम से खोज किए बिना क्या करता है।


मैं छोटे नामों के लिए उत्सुक नहीं हूं। एक तरफ यह सभी उपयोगों को खोजने के लिए एक अनोखी (ish) नामकरण शैली का अर्थ है। दूसरी ओर, और शायद मैं भाग्यशाली रहा हूं, मुझे ताले खोजने की आवश्यकता नहीं थी; मुझे लगता है कि अगर मुझे "लॉक" की खोज करनी पड़ेगी (तो मुझे आसानी से अनदेखा करने के लिए कुछ झूठे सकारात्मकता के साथ एक अच्छा पर्याप्त परिणाम मिलेगा।
क्रिस सिनक्लेयर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.