C++ Mutex لاک

C Mutex Lak



C++ اچھی کارکردگی، اعلیٰ درستگی، اور کافی میموری مینجمنٹ سسٹم کے ساتھ تیز ترین پروگرامنگ زبانوں میں سے ایک کے طور پر جانا جاتا ہے۔ یہ پروگرامنگ لینگویج ایک سے زیادہ تھریڈز کے ایک ساتھ عمل درآمد کی بھی حمایت کرتی ہے اور ان کے درمیان متعدد وسائل کے اشتراک کے ساتھ۔ ملٹی تھریڈنگ میں، تھریڈ صرف پڑھنے کے عمل کو انجام دینے کے لیے ہوتا ہے جس سے کوئی مسئلہ نہیں ہوتا کیونکہ اس وقت دوسرے تھریڈز کیا کر رہے ہیں اس سے تھریڈ متاثر نہیں ہوتا ہے۔ لیکن اگر ان تھریڈز کو ان کے درمیان وسائل کا اشتراک کرنا تھا، تو ایک تھریڈ اس وقت ڈیٹا میں ترمیم کر سکتا ہے جس سے مسئلہ پیدا ہوتا ہے۔ اس مسئلے سے نمٹنے کے لیے، ہمارے پاس C++ 'Mutex' ہے جو ہم آہنگی فراہم کرکے ہمارے کوڈ/آبجیکٹ تک متعدد وسائل تک رسائی کو روکتا ہے جس میں کہا گیا ہے کہ آبجیکٹ/کوڈ تک رسائی ایک وقت میں صرف ایک تھریڈ کو فراہم کی جا سکتی ہے، تاکہ متعدد تھریڈز بیک وقت اس آبجیکٹ تک رسائی حاصل نہ کرسکیں۔

طریقہ کار:

ہم جان لیں گے کہ ہم mutex لاک کا استعمال کرتے ہوئے ایک ہی وقت میں ایک ہی وقت میں ایک سے زیادہ تھریڈز کی رسائی کو کیسے روک سکتے ہیں۔ ہم mutex لاک کے نحو کے بارے میں بات کریں گے، ایک سے زیادہ تھریڈنگ کیا ہے، اور ہم mutex لاک کا استعمال کرتے ہوئے ایک سے زیادہ تھریڈنگ کی وجہ سے پیدا ہونے والے مسائل سے کیسے نمٹ سکتے ہیں۔ پھر، ہم ایک سے زیادہ تھریڈنگ کی مثال لیں گے اور ان پر mutex لاک کو نافذ کریں گے۔







نحو:

اگر ہم یہ جاننا چاہتے ہیں کہ ہم mutex لاک کو کیسے نافذ کر سکتے ہیں تاکہ ہم اپنے آبجیکٹ یا کوڈ کی طرف بیک وقت متعدد تھریڈز تک رسائی کو روک سکیں، تو ہم درج ذیل نحو کا استعمال کر سکتے ہیں:



$ std :: mutex mut_x

$mut_x تالا ( ) ;

void func_name ( ) {

$ // کوڈ جو ہم ایک سے زیادہ تھریڈز سے چھپانا چاہتے ہیں وہ یہاں لکھا جائے گا۔

$mut_x کھولتا ہے ( ) ;

}

اب ہم اس نحو کو ڈمی مثال اور سیوڈو کوڈ میں استعمال کریں گے (کہ ہم صرف اس طرح نہیں چل سکتے جیسے یہ کوڈ ایڈیٹر میں ہے) آپ کو بتانے کے لیے کہ ہم اس نحو کو کس طرح استعمال کر سکتے ہیں جیسا کہ درج ذیل میں بتایا گیا ہے:



$ std :: mutex mut_x

باطل بلاک ( ) {

$mut_x تالا ( ) ;

$ std :: cout << 'ہیلو' ;

$mut_x کھولتا ہے ( ) ;

}

مثال:

اس مثال میں، آئیے پہلے ملٹی تھریڈ آپریشن بنانے کی کوشش کریں اور پھر اس آپریشن کو میوٹیکس لاک اور انلاک سے گھیر لیں تاکہ بنائے گئے کوڈ یا آبجیکٹ کو آپریشن کی ہم آہنگی فراہم کی جا سکے۔ Mutex ریس کے حالات سے نمٹتا ہے جو ایسی اقدار ہیں جو کافی غیر متوقع ہیں اور وہ ان دھاگوں کے سوئچنگ پر منحصر ہیں جو وقت سے آگاہ ہیں۔ mutex کے لیے مثال کو نافذ کرنے کے لیے، ہمیں پہلے ریپوزٹریز سے اہم اور مطلوبہ لائبریریاں درآمد کرنے کی ضرورت ہے۔ مطلوبہ لائبریریاں ہیں:





$ # شامل کریں

$ # شامل کریں

$ # شامل ہیں

'iostream' لائبریری ہمیں ڈیٹا کو Cout کے طور پر ظاہر کرنے، ڈیٹا کو Cin کے طور پر پڑھنے، اور بیان کو endl کے طور پر ختم کرنے کے لیے ایک فنکشن فراہم کرتی ہے۔ ہم تھریڈز کے پروگراموں یا فنکشنز کو استعمال کرنے کے لیے 'تھریڈ' لائبریری کا استعمال کرتے ہیں۔ 'mutex' لائبریری ہمیں کوڈ میں mutex لاک اور ان لاک دونوں کو نافذ کرنے کی اجازت دیتی ہے۔ ہم '# شامل' کا استعمال کرتے ہیں کیونکہ یہ کوڈ میں شامل لائبریری سے متعلق تمام پروگراموں کی اجازت دیتا ہے۔

اب، پچھلا مرحلہ مکمل ہونے کے بعد، ہم std کا استعمال کرتے ہوئے mutex کلاس یا mutex کے لیے عالمی متغیر کی وضاحت کرتے ہیں۔ پھر، ہم mutex لاک اور ان لاک کے لیے ایک فنکشن بناتے ہیں جسے ہم بعد میں کوڈ میں کال کر سکتے ہیں۔ اس مثال میں، ہم اس فنکشن کو بلاک کا نام دیتے ہیں۔ بلاک فنکشن کے باڈی میں، ہم سب سے پہلے 'mutex.lock()' کو کال کرتے ہیں اور کوڈ کی منطق لکھنا شروع کرتے ہیں۔



mutex.lock() ہماری تخلیق کردہ آبجیکٹ یا کوڈ تک پہنچنے کے لیے دوسرے تھریڈز کی رسائی سے انکار کرتا ہے تاکہ ایک وقت میں صرف ایک تھریڈ ہمارے آبجیکٹ کو پڑھ سکے۔ منطق میں، ہم ایک لوپ چلاتے ہیں جو انڈیکس پر 0 سے 9 تک چلتا ہے۔ ہم لوپ میں ویلیوز دکھاتے ہیں۔ ایک بار جب یہ منطق mutex لاک میں اس کے آپریشن کے بعد یا منطق سے باہر نکلنے کے بعد بن جاتی ہے، تو ہم 'mutex.unlock()' طریقہ کہتے ہیں۔ یہ میتھڈ کال ہمیں میوٹیکس لاک سے تخلیق شدہ آبجیکٹ کو ان لاک کرنے کی اجازت دیتی ہے کیونکہ آبجیکٹ کی ایک ہی تھریڈ تک رسائی پہلے فراہم کی گئی تھی اور ایک بار اس آبجیکٹ پر آپریشن ایک بار میں ایک تھریڈ کے ذریعے کیا جاتا ہے۔ اب ہم چاہتے ہیں کہ دوسرے تھریڈز بھی اس چیز یا کوڈ تک رسائی حاصل کریں۔ بصورت دیگر، ہمارا کوڈ 'ڈیڈ لاک' کی صورت حال میں آگے بڑھتا ہے جس کی وجہ سے mutex کے ساتھ بنائی گئی چیز ہمیشہ کے لیے مقفل حالت میں رہتی ہے اور کوئی دوسرا دھاگہ اس چیز تک رسائی حاصل نہیں کر سکے گا۔ لہذا، ایک نامکمل آپریشن جاری رہتا ہے۔ اس کے بعد، ہم بلاک فنکشن سے باہر نکلتے ہیں اور مین پر چلے جاتے ہیں۔

مرکزی طور پر، ہم صرف اپنے بنائے ہوئے mutex کو 'std :: thread thread_name (پہلے سے بنائے گئے بلاک فنکشن کو یہاں کال کرتے ہوئے جس میں ہم نے mutex بنایا تھا)' کا استعمال کرتے ہوئے تین تھریڈ بنا کر thread1، thread2، اور thread3 وغیرہ ناموں کے ساتھ ظاہر کرتے ہیں۔ اس طرح تین دھاگے بنتے ہیں۔ اس کے بعد ہم 'thread_name' کو کال کرکے ان تینوں تھریڈز کو ایک ساتھ عمل میں لانے کے لیے شامل ہوتے ہیں۔ شمولیت ()' طریقہ۔ اور پھر، ہم صفر کے برابر قدر واپس کرتے ہیں۔ مثال کی پہلے بیان کردہ وضاحت کو کوڈ کی شکل میں لاگو کیا گیا ہے جو درج ذیل شکل میں دکھایا جا سکتا ہے:

کوڈ کے آؤٹ پٹ میں، ہم تینوں تھریڈز کا ایک ایک کرکے عمل درآمد اور ڈسپلے دیکھ سکتے ہیں۔ ہم دیکھ سکتے ہیں چاہے ہماری درخواست ملٹی تھریڈنگ کے زمرے میں آتی ہو۔ پھر بھی، کسی بھی تھریڈ نے ڈیٹا کو اوور رائٹ یا اس میں ترمیم نہیں کی ہے اور 'فنکشن بلاک' کے mutex کے نفاذ کی وجہ سے ترمیم شدہ وسائل کا اشتراک نہیں کیا ہے۔

نتیجہ

یہ گائیڈ C++ میں استعمال ہونے والے mutex فنکشن کے تصور کی تفصیلی وضاحت کرتا ہے۔ ہم نے اس بات پر تبادلہ خیال کیا کہ ملٹی تھریڈنگ ایپلی کیشنز کیا ہیں، ہمیں ملٹی تھریڈنگ ایپلی کیشنز میں کن مسائل کا سامنا کرنا پڑتا ہے، اور ہمیں ملٹی تھریڈنگ ایپلی کیشنز کے لیے mutex کو لاگو کرنے کی ضرورت کیوں ہے۔ اس کے بعد ہم نے چھدم کوڈ کا استعمال کرتے ہوئے ڈمی مثال کے ساتھ mutex کے نحو پر تبادلہ خیال کیا۔ پھر، ہم نے C++ بصری اسٹوڈیو پر mutex کے ساتھ ملٹی تھریڈنگ ایپلی کیشنز پر ایک مکمل مثال نافذ کی۔