यदि कोई थ्रेड पहले से ही लॉक रखता है, तो यह बिना किसी समस्या के "उस लॉक को" ले सकता है।
रूप क्यों कि है, (और क्यों यह एक अच्छा विचार है), तो निम्न स्थिति, जहां हम एक परिभाषित ताला एक के कार्यक्रम में कहीं और आदेश देने पर विचार किया है -> ख:
void f()
{
lock(a)
{ /* do stuff inside a */ }
}
void doStuff()
{
lock(b)
{
//do stuff inside b, that involves leaving b in an inconsistent state
f();
//do more stuff inside b so that its consistent again
}
}
ओह, हमने अभी हमारे लॉक ऑर्डरिंग का उल्लंघन किया है और हमारे हाथों पर संभावित डेडलॉक है।
हम वास्तव में निम्न करने के लिए सक्षम होना चाहिए :
function doStuff()
{
lock(a)
lock(b)
{
//do stuff inside b, that involves leaving b in an inconsistent state
f();
//do more stuff inside b so that its consistent again
}
}
ताकि हमारे ताला आदेश बनाए रखा है, बिना आत्म deadlocking हम पर कब कॉल f()
।
स्रोत
2011-02-17 21:55:53
आप इसे डेडलॉक क्यों करने की उम्मीद कर रहे हैं? (यह भी, http://stackoverflow.com/questions/391913/re-entrant-locks-in-c के समान है जो मदद कर सकता है) – AakashM
यह स्पष्ट रूप से इसका एक डुप्लिकेट है, लेकिन यह प्रश्न का शीर्षक असीम रूप से बेहतर है (उन लोगों के लिए जो शायद इसकी तलाश करेंगे)। –