Reentrant mutex
کمپیوٹر سائنس میں، ری اینٹرنٹ میوٹیکس (ریکرسو میوٹیکس، ریکرسو لاک) ایک خاص قسم کا باہمی اخراج (میوٹیکس) آلہ ہے جسے تعطل پیدا کیے بغیر، ایک ہی عمل/دھاگے کے ذریعے متعدد بار لاک کیا جا سکتا ہے۔ اگرچہ عام میوٹیکس (لاک) پر "لاک" آپریشن انجام دینے کی کوئی بھی کوشش یا تو ناکام ہو جائے گی یا بلاک ہو جائے گی جب میوٹیکس پہلے ہی لاک ہو جائے گا، لیکن ریکرسو میوٹیکس پر یہ آپریشن تب ہی کامیاب ہوگا جب لاکنگ تھریڈ وہ ہو جس میں پہلے ہی لاک ہو۔ عام طور پر، ایک ریکرسو میوٹیکس کتنی بار اسے لاک کیا گیا ہے اس کا سراغ لگاتا ہے، اور دوسرے دھاگوں سے اسے لاک کرنے سے پہلے یکساں طور پر بہت سے ان لاک آپریشن انجام دینے کی ضرورت ہوتی ہے۔ موٹیویشن ریکرسو میوٹیکس باقاعدہ میوٹیکس کے ساتھ غیر ری اینٹریسی کے مسئلے کو حل کرتے ہیں: اگر کوئی فنکشن جو لاک لیتا ہے اور کال بیک کو انجام دیتا ہے اسے خود کال بیک کے ذریعے بلایا جاتا ہے، تو ڈیڈ لاک پیدا ہوتا ہے۔ سڈوکوڈ میں، یہ مندرجہ ذیل صورتحال ہے: ور ایم: میوٹیکس// ایک غیر تکراری میوٹیکس، ابتدائی طور پر غیر مقفل۔ فنکشن لاک _ اینڈ _ کال (i: انٹیجر) m.lock () کال بیک (i) m.unlock () فنکشن کال بیک (i: انٹیجر) اگر i> 0 لاک _ اینڈ _ کال (i-1) لاک _ اینڈ _ کال (1)// فنکشن کو مدعو کرنا ان تعریفوں کو دیکھتے ہوئے، فنکشن کال واقعات کی درج ذیل ترتیب کا سبب بنے گی:-میوٹیکس لاک-کیونکہ-ڈیڈ لاک، کیونکہ پہلے سے ہی لاک ہے، لہذا انجام دینے والا تھریڈ بلاک ہو جائے گا، خود انتظار کر رہا ہے۔ میوٹیکس کو ریکرسو کے ساتھ تبدیل کرنے سے مسئلہ حل ہو جاتا ہے، کیونکہ فائنل بلاک کیے بغیر کامیاب ہو جائے گا۔ عملی استعمال ڈبلیو رچرڈ سٹیونز نوٹ کرتے ہیں کہ ریکرسو لاکز کو صحیح طریقے سے استعمال کرنا "مشکل" ہے، اور APIs کو تبدیل کیے بغیر سنگل تھریڈ کوڈ کو اپنانے کے لیے ان کے استعمال کی سفارش کرتے ہیں، لیکن "صرف اس صورت میں جب کوئی دوسرا حل ممکن نہ ہو"۔ جاوا زبان کا مقامی مطابقت پذیری میکانزم، مانیٹر، تکراری تالے استعمال کرتا ہے۔ لفظی طور پر، لاک کوڈ کا ایک بلاک ہے جس سے پہلے 'مطابقت پذیر' مطلوبہ الفاظ ہوتے ہیں اور قوسین میں کوئی بھی آبجیکٹ حوالہ جو میوٹیکس کے طور پر استعمال ہوگا۔ مطابقت پذیر بلاک کے اندر، دی گئی چیز کو ویٹ ()، نوٹیفائی ()، یا نوٹیفائی آل () کرکے کنڈیشن متغیر کے طور پر استعمال کیا جا سکتا ہے۔ اس طرح تمام آبجیکٹ ریکرسو میوٹیکس اور کنڈیشن متغیر دونوں ہوتے ہیں۔ مثال تھریڈ اے کالز فنکشن ایف جو تھریڈ بی کالز فنکشن ایف کو آگے بڑھانے سے پہلے اپنے لیے ایک ری اینٹرنٹ لاک حاصل کرتا ہے جو اپنے لیے ایک ری اینٹرنٹ لاک حاصل کرنے کی کوشش کرتا ہے لیکن پہلے سے بقایا ہونے کی وجہ سے نہیں ہو سکتا، جس کے نتیجے میں یا تو بلاک ہو جاتا ہے (یہ انتظار کرتا ہے)، یا اگر تھریڈ اے کی درخواست کی جائے تو ٹائم آؤٹ خود کو بار بار کال کرتا ہے۔ یہ پہلے سے ہی تالا کا مالک ہے، لہذا یہ خود کو بلاک نہیں کرے گا (کوئی تعطل نہیں)۔ یہ ری اینٹرنٹ میوٹیکس کا مرکزی خیال ہے، اور یہی چیز اسے باقاعدہ لاک سے مختلف بناتی ہے۔ تھریڈ بی کا ایف اب بھی انتظار کر رہا ہے، یا اس نے ٹائم آؤٹ پکڑا ہے اور اس کے ارد گرد کام کیا ہے تھریڈ اے کا ایف ختم ہوتا ہے اور اس کا لاک جاری کرتا ہے۔ تھریڈ بی کا ایف اب ایک ری اینٹرنٹ لاک حاصل کر سکتا ہے اور آگے بڑھ سکتا ہے اگر یہ ابھی بھی انتظار کر رہا تھا تو سافٹ ویئر ایمولیشن سافٹ ویئر ایمولیشن کو درج ذیل ڈھانچے کا استعمال کرتے ہوئے پورا کیا جا سکتا ہے: ایک "کنٹرول" شرط جس میں باقاعدہ لاک مالک شناخت کنندہ کا استعمال کیا جاتا ہے، جو ہر تھریڈ کے لیے منفرد ہے (خالی کرنے میں ڈیفالٹ/سیٹ نہ کرنا) ایکوزیشن کاؤنٹ (صفر پر ڈیفالٹ کرنا) ایکوزیشن کنٹرول کنڈیشن حاصل کریں۔ اگر مالک سیٹ ہے اور موجودہ تھریڈ نہیں ہے، تو کنٹرول کنڈیشن کے مطلع ہونے کا انتظار کریں (یہ بھی کنڈیشن جاری کرتا ہے)۔ مالک کو موجودہ دھاگے پر سیٹ کریں۔ مالک کی شناخت کرنے والے کو اس وقت پہلے ہی صاف کر دیا جانا چاہیے تھا جب تک کہ حصول کار پہلے سے ہی مالک نہ ہو۔ حصول کی تعداد میں اضافہ کریں (نئے مالکان کے لیے ہمیشہ 1 ہونا چاہیے)۔ کنٹرول کنڈیشن کو چھوڑ دیں۔ ریلیز کنٹرول کنڈیشن حاصل کریں، اس بات پر زور دیتے ہوئے کہ مالک ریلیز کرنے والا ہے۔ حصول کی گنتی کو کم کریں، اس بات پر زور دیتے ہوئے کہ گنتی صفر سے زیادہ یا برابر ہے۔ اگر حصول کی گنتی صفر ہے، تو مالک کی معلومات کو صاف کریں اور کنٹرول کی حالت کو مطلع کریں۔ کنٹرول کنڈیشن کو چھوڑ دیں۔ حوالہ جات ہم آہنگی کنٹرول