मुझे एक सूची के साथ साझा किया गया, जो कि मुझे आवश्यक था, ने साझा किया। मेरा मुद्दा था, मेरे पास कई ग्राहक थे जो एक होस्ट के आंतरिक डेटा के साथ बातचीत करना चाहते थे। आमतौर पर, होस्ट डेटा को स्वयं अपडेट करता है, हालांकि, यदि कोई क्लाइंट इसे अनुरोध करता है, तो होस्ट को तब तक अपडेट करने से रोकने की आवश्यकता है जब तक कोई क्लाइंट होस्ट डेटा तक नहीं पहुंच रहा हो। उसी समय, कोई ग्राहक अनन्य एक्सेस के लिए कह सकता है, ताकि कोई अन्य क्लाइंट, और न ही होस्ट, उस होस्ट डेटा को संशोधित कर सके।
मैंने यह कैसे किया, मैंने एक संरचना बनाई:
struct UpdateLock
{
typedef std::shared_ptr< UpdateLock > ptr;
};
प्रत्येक ग्राहक ऐसा होगा:
UpdateLock::ptr m_myLock;
तब मेजबान में विशिष्टता के लिए एक कमजोर_प्रति सदस्य और गैर-अनन्य ताले के लिए कमजोर_पत्रों की एक सूची होगी:
std::weak_ptr< UpdateLock > m_exclusiveLock;
std::list< std::weak_ptr< UpdateLock > > m_locks;
लॉक करने में सक्षम करने के लिए एक फ़ंक्शन है, और होस्ट लॉक है या नहीं यह जांचने के लिए एक और फ़ंक्शन है:
UpdateLock::ptr LockUpdate( bool exclusive );
bool IsUpdateLocked( bool exclusive ) const;
मैं LockUpdate, IsUpdateLocked, और समय-समय पर होस्ट की अद्यतन दिनचर्या में ताले के लिए परीक्षण करता हूं। लॉक के लिए परीक्षण करना उतना ही सरल है, जितना कि कमजोर_प्रति की समय सीमा समाप्त होने पर और m_locks सूची से कोई भी समय सीमा समाप्त करने की जाँच करना (मैं केवल होस्ट अपडेट के दौरान ऐसा करता हूं), मैं जांच कर सकता हूं कि क्या सूची खाली है; उसी समय, मुझे स्वचालित अनलॉकिंग मिलती है जब एक ग्राहक साझा किए गए शेयर को साझा करता है। वे उस पर लटके होते हैं, जो तब भी होता है जब एक ग्राहक स्वचालित रूप से नष्ट हो जाता है।
सभी प्रभाव पर, क्योंकि ग्राहकों को शायद ही कभी विशिष्टता की आवश्यकता होती है (आम तौर पर केवल परिवर्धन और विलोपन के लिए आरक्षित होती है), ज्यादातर समय लॉकअपडेट (गलत) के लिए एक अनुरोध, जिसे गैर-अनन्य कहना है, तब तक सफल होता है जब तक (! M_exclusiveLock)। और एक लॉकअपडेट (सच्चा), विशिष्टता के लिए एक अनुरोध, तभी सफल होता है जब दोनों (! M_exclusiveLock) और (m_locks.empty ())।
अनन्य और गैर-अनन्य ताले के बीच शमन करने के लिए एक कतार को जोड़ा जा सकता है, हालांकि, मेरे पास अब तक कोई टक्कर नहीं है, इसलिए मैं इंतजार करता हूं कि जब तक समाधान जोड़ने के लिए नहीं होता है (ज्यादातर तो मेरे पास एक वास्तविक दुनिया परीक्षण स्थिति है)।
अब तक यह मेरी जरूरतों के लिए अच्छा काम कर रहा है; मैं इसे विस्तारित करने की आवश्यकता की कल्पना कर सकता हूं, और कुछ मुद्दे जो विस्तारित उपयोग पर उत्पन्न हो सकते हैं, हालांकि, इसे लागू करने के लिए त्वरित था, और बहुत कम कस्टम कोड की आवश्यकता थी।