मान लें कि मेरे पास एक बहुप्रचारित सी ++ प्रोग्राम है जो फ़ंक्शन कॉल के रूप में handleRequest(string key)
पर अनुरोधों को संभालता है। handleRequest
पर प्रत्येक कॉल एक अलग थ्रेड में होता है, और key
के लिए मनमाने ढंग से संभावित मानों की बड़ी संख्या होती है।मैं सी ++ में लॉक के रूप में एक मनमानी स्ट्रिंग का उपयोग कैसे करूं?
मैं निम्नलिखित व्यवहार चाहते हैं: वे key
के लिए एक ही मूल्य है जब
handleRequest(key)
को एक साथ कॉल क्रमांकित हैं।- वैश्विक क्रमबद्धता कम हो गई है।
handleRequest
के शरीर इस प्रकार दिखाई देंगे:
void handleRequest(string key) {
KeyLock lock(key);
// Handle the request.
}
प्रश्न: मैं KeyLock
कैसे लागू होगा आवश्यक व्यवहार पाने के लिए?
एक अनुभवहीन कार्यान्वयन इस तरह से शुरू हो सकता है:
KeyLock::KeyLock(string key) {
global_lock->Lock();
internal_lock_ = global_key_map[key];
if (internal_lock_ == NULL) {
internal_lock_ = new Lock();
global_key_map[key] = internal_lock_;
}
global_lock->Unlock();
internal_lock_->Lock();
}
KeyLock::~KeyLock() {
internal_lock_->Unlock();
// Remove internal_lock_ from global_key_map iff no other threads are waiting for it.
}
... लेकिन यह है कि शुरुआत में एक वैश्विक ताला और प्रत्येक अनुरोध के अंत में, और प्रत्येक अनुरोध के लिए एक अलग Lock
वस्तु के निर्माण की आवश्यकता है। यदि handleRequest
पर कॉल के बीच विवाद अधिक है, तो यह कोई समस्या नहीं हो सकती है, लेकिन अगर विवाद कम हो तो यह बहुत अधिक ओवरहेड लगा सकता है।
आम तौर पर केवल कई नामित म्यूटेक्स बना सकते हैं। लिनक्स पर कम से कम आप कितने प्राप्त कर सकते हैं, लेकिन मैं इस विधि का उपयोग पुराने म्यूटेक्स एकत्र करने के लिए कुछ कचरे के साथ करने से सावधान रहूंगा। –