यहाँ एक प्रकार टी के चारों ओर एक त्वरित धागे की सुरक्षा आवरण है
mutex_guarded<std::vector<int>> guarded;
auto s0 = guarded->size();
auto s1 = guarded->*[](auto&&e){return e.size();};
दोनों लगभग एक ही बात करते हैं, और वस्तु पहरा केवल पहुँचा जा सकता है जब म्यूटेक्स बंद हो जाता है।
@tsyvarev के जवाब (कुछ मामूली परिवर्तन के साथ) से चोरी हम पाते हैं:
class shared_recursive_mutex
{
std::shared_mutex m
public:
void lock(void) {
std::thread::id this_id = std::this_thread::get_id();
if(owner == this_id) {
// recursive locking
++count;
} else {
// normal locking
m.lock();
owner = this_id;
count = 1;
}
}
void unlock(void) {
if(count > 1) {
// recursive unlocking
count--;
} else {
// normal unlocking
owner = std::thread::id();
count = 0;
m.unlock();
}
}
void lock_shared() {
std::thread::id this_id = std::this_thread::get_id();
if (shared_counts->count(this_id)) {
++(shared_count.get_locked()[this_id]);
} else {
m.lock_shared();
shared_count.get_locked()[this_id] = 1;
}
}
void unlock_shared() {
std::thread::id this_id = std::this_thread::get_id();
auto it = shared_count->find(this_id);
if (it->second > 1) {
--(it->second);
} else {
shared_count->erase(it);
m.unlock_shared();
}
}
private:
std::atomic<std::thread::id> owner;
std::atomic<std::size_t> count;
mutex_guarded<std::map<std::thread::id, std::size_t>> shared_counts;
};
try_lock
और try_lock_shared
एक व्यायाम के रूप में छोड़ दिया।
लॉक और अनलॉक दोनों लॉक को दो बार म्यूटक्स लॉक करें (यह सुरक्षित है, क्योंकि शाखाएं वास्तव में "म्यूटेक्स के नियंत्रण में यह धागा" है, और दूसरा धागा उस जवाब को "नहीं" से "हां" में बदल नहीं सकता है या ठीक इसके विपरीत)। आप के बजाय ->*
के साथ एक लॉक के साथ ऐसा कर सकते हैं, जो इसे तेजी से (तर्क में कुछ जटिलता की लागत पर) बना देगा।
उपरोक्त एक विशेष लॉक, फिर साझा लॉक रखने का समर्थन नहीं करता है। यह मुश्किल है। यह एक साझा लॉक रखने का समर्थन नहीं कर सकता है, फिर एक अद्वितीय लॉक में अपग्रेड कर सकता है, क्योंकि यह 2 धागे की कोशिश करते समय इसे डेडलॉकिंग से रोकने के लिए मूल रूप से असंभव है।
वह अंतिम मुद्दा हो सकता है कि साझा म्यूटेक्स एक बुरा विचार क्यों है।
मैं ऐसी चीज लिखने की कोशिश नहीं करता। लॉक रिकर्सिव बनाने के बारे में कैसे? –
एक रिकर्सिव म्यूटेक्स की आवश्यकता आमतौर पर एक संकेत है कि कोड को फिर से डिजाइन करने की आवश्यकता है। –