एकाधिक ताले लॉक करने का व्यापक रूप से ज्ञात तरीका है, जो इस क्रम के अनुसार निश्चित रैखिक क्रम और एक्वायरिंग ताले चुनने पर निर्भर करता है।एकाधिक म्यूटेक्स लॉकिंग रणनीतियों और क्यों पुस्तकालय पता तुलना का उपयोग नहीं करते
उदाहरण के लिए, "Acquire a lock on two mutexes and avoid deadlock" के उत्तर में प्रस्तावित किया गया था। विशेष रूप से, पर आधारित समाधान पता लगाना काफी सुरुचिपूर्ण और स्पष्ट लगता है।
जब मैंने यह जांचने की कोशिश की कि यह वास्तव में कैसे कार्यान्वित किया जाता है, तो मुझे आश्चर्य हुआ कि यह समाधान व्यापक रूप से उपयोग नहीं किया जाता है।
के शब्दों में Kernel Docs - Unreliable Guide To Locking:
पाठ्यपुस्तकें आपको बता देंगे कि अगर आप हमेशा एक ही क्रम में बंद है, तो आप गतिरोध के इस प्रकार प्राप्त कभी नहीं होगा। प्रैक्टिस आपको बताएगा कि यह दृष्टिकोण स्केल नहीं करता है: जब मैं एक नया लॉक बनाता हूं, तो मुझे समझ में नहीं आता है कि 5000 लॉक पदानुक्रम में फिट होगा।
pthreads प्रतीत नहीं होता है ऐसे तंत्र बिल्कुल में बनाया गया है।
Boost.Thread की कोशिश कर रहा है और के रूप में कई mutexes ताला लगा के रूप में यह इस समय संभव है पर आधारित है पूरी तरह से अलग समाधान, lock()
कई (2 से 5) mutexes के लिए के साथ आया था।
यह Boost.Thread स्रोत कोड के टुकड़ा (: 1291 बूस्ट 1.48.0, बढ़ावा/धागा/locks.hpp): है
template<typename MutexType1,typename MutexType2,typename MutexType3>
void lock(MutexType1& m1,MutexType2& m2,MutexType3& m3)
{
unsigned const lock_count=3;
unsigned lock_first=0;
for(;;)
{
switch(lock_first)
{
case 0:
lock_first=detail::lock_helper(m1,m2,m3);
if(!lock_first)
return;
break;
case 1:
lock_first=detail::lock_helper(m2,m3,m1);
if(!lock_first)
return;
lock_first=(lock_first+1)%lock_count;
break;
case 2:
lock_first=detail::lock_helper(m3,m1,m2);
if(!lock_first)
return;
lock_first=(lock_first+2)%lock_count;
break;
}
}
}
जहां सफलता और mutexes की संख्या पर lock_helper
रिटर्न 0
कि अन्यथा सफलतापूर्वक बंद नहीं किया गया था।
यह समाधान पते या किसी अन्य प्रकार की आईडी की तुलना में बेहतर क्यों है? मुझे पॉइंटर तुलना के साथ कोई समस्या नहीं दिखाई देती है, जिसे इस तरह के "अंधे" लॉकिंग का उपयोग करके टाला जा सकता है।
क्या लाइब्रेरी स्तर पर इस समस्या को हल करने के बारे में कोई अन्य विचार है?
मुझे यहां एक दिलचस्प धागा मिला है: https://groups.google.com/d/topic/comp.programming.threads/iyZ-0UcR7bw/discussion –
वास्तविक डेडलॉक्स कुछ फ़ंक्शन के कारण होते हैं जो लंबे समय तक लॉक प्राप्त करते हैं पहले और बहुत दूर। यह योजना इसके खिलाफ कोई सुरक्षा प्रदान नहीं करती है। –