वहाँ एक सी ++ std::lock()
जंग में सुविधा की तरह इस तरह कोड में deadlocking को रोकने के लिए है:क्या डेडलॉकिंग को रोकने के दौरान जंग में एकाधिक म्यूटेक्स लॉक करने की सुविधा है?
type Type0 = Arc<Mutex<u8>>;
type Type1 = Arc<Mutex<u16>>;
fn foo(a: Type0, b: Type1) {
let a_guard = a.lock().unwrap();
let b_guard = b.lock().unwrap();
}
fn bar(a: Type0, b: Type1) {
let b_guard = b.lock().unwrap();
let a_guard = a.lock().unwrap();
}
तो foo
वहाँ गतिरोध का एक मौका है धागा 0 और bar
से पुकारा जाता है धागा -1 द्वारा। क्या कुछ ऐसा है, उम्मीद है कि अलग-अलग है क्योंकि मेरे पास 2 से अधिक हो सकते हैं, इस के साथ मेरी मदद करने के लिए या क्या मैं लॉकिंग के आदेश की शुद्धता की पुष्टि कर रहा हूं?
the documentation for std::lock
से:
एक गतिरोध परिहार एल्गोरिथ्म का उपयोग कर गतिरोध से बचने के लिए दिए गए
Lockable
वस्तुओंlock1
,lock2
,...
,lockn
लॉक करता है।
मान्य रूप से मुझे नहीं पता कि 'std :: lock' कैसे काम करता है, लेकिन (जब तक आप डेटा को एक साथ लंपाने और इसे लॉक/अनलॉक करने में एमएमस्टिक के उत्तर का पालन नहीं करते) मैं नहीं देखता कि आप कभी * गारंटी * कैसे कर सकते हैं * कोई deadlocks नहीं। निश्चित रूप से, आप उन्हें सही क्रम में करने के लिए एक मैक्रो लिख सकते हैं - लेकिन फिर आपने * जांच की समस्या को अभी बदल दिया है कि आप हमेशा उन्हें सही क्रम में लॉक करते हैं * की जांच करने की मुश्किल-आसान समस्या में * आप हमेशा जांचते हैं मैक्रो का उपयोग करें और कभी भी कॉल करें .lock() सीधे *। सही? – trentcl
[दिलचस्प, संबंधित, लेकिन (मेरे लिए) 'std :: lock' की पूरी तरह से संतोषजनक चर्चा नहीं है] (http: // stackoverflow।कॉम/प्रश्न/18520 9 83/आईएस-स्टडलॉक-बीमार परिभाषित-अनुपूरक-या-बेकार # 18521108) – trentcl