 بسم اللہ الرحمن الرحیم آج ہم موڈیول 126 دسکس کریں گے موڈیول 126 کے اندر ہم نے کیونکہ last time ڈھریڈنگ دسکس کی تھی اس کے اندر ہم common mistakes اور precautions کی بات کریں گے جب آپ ڈھریڈنگ کے ساتھ کام کر رہے ہیں ڈھریڈنگ کی program میں کر رہے ہیں تو آپ کیا ایسے مئیز لیں کہ آپ ڈھریڈنگ کا ایک اچھا program لکھ سکے جو اس کے اندر کچھ کنسپشل چیزیں رگارڈنگ ڈھریڈنگ آپ کو پتا نکنے چہے ہیں کہ ڈھریڈنگ جو ہے ان کی ایک سنکروناس نیچر ہوتی ہے اگر نمبر اگر ڈھریڈنگ ایکزیکوٹ کریں تو آپ کو نہیں پہلا کہ ڈھریڈ کن سی لئے کھونس جگہ پہلے ڈھریڈنگ کریے ڈھیسی لئے کھونس اس کرنائیزیشی نی گا آنے ہی ایس جھاڑا سنکرونایزیشن نہیں ہوتی اگر ثریڈز کی اپر کسی کسم کی آپ نے اسنکرونیزیسین انفورس نہیں کیوی تو ثریڈز کسی بھی اوٹر میں انگزیکوٹ ہوں گے کسی بھی طرح سے انگزیکوٹ ہو سکتے ہیں تو وہ ضروری نہیں ہے کہ کسی خاص کسم پر سیکونس وہ فالو کریں تو یہ والا جو اے اسنکرونس بھیویر ہے یہ یسول بھی ہے کیونکہ ہم جب ثریڈنگ استعمال کردیں تو ہمارا مقصد بھی یہ ہوتا ہے کہ کنکرنڈلی اپریشنز پر فام ہوں اس لیہاں سے یہ یسول بھی ہے لیکن اس کنکرنڈ اپریشنز کی وجہ سے ہمیں سرطن ڈیفکلٹیز کا سامنا ہوتا وہ ڈیفکلٹیز کیا ہے ان کی باد کرتے ہیں اور ان ڈیفکلٹیز کو کیسے ڈیفکلٹیز کو کیسے ڈیفکلٹیز کیا جا سکتے ہیں پھرسلی آپ کو جب ثریڈنگ بیسٹ کوئی آپ پر کرام لکریں تو آپ کو اس چیز کا خیال ہونا چاہی ہے کہ جو ثریڈز ہیں اس کے بارے میں آپ کو ازمشن نہ کریں کہ ثریڈز یہ کس سیکونز کے اندر کس اردر کے اندر executive ہوں گے اس کے بارے میں آپ کو کوئی ازمشن نہیں کرنی چاہیے آپ ڈین میں یہ رکھیں کہ یہ کسی بھی اردر کے اندر اس کی ڈیفکلٹیز ہوسکتی ہے تو آپ ڈیفکلٹ کو اس تریک سے لکھیں جس مرزی اردر کے اندر اس کی ازمشن ہو کبھی بھی ایسی سچوشن آئے کہ جس کی وجہ سے کوئی اقسیبشن نہ کرو یا ایسی سیچویشن آئے کہ جس دیتا کو آپ ریڈ کرنا چاہر ہیں وہ دیتا ویلیبل نہ ہوں یا جس پر رائٹ کرنا چاہر ہیں وہ دیتا ایکسیسبل نہ ہوں تو اس کے اوڈر کے بارے میں آپ نے کوئی ازمشن نہیں کرنی جب آپ نے پکرام لکھنا اس کو اس تریک سے لکھنا For example اگر ایک پیرنٹ تھریڈ ہے اور وہ پیرنٹ تھریڈ جو ہے وہ ایک چائل تھریڈ بناتی ہے تو ہوسکتا ہے کہ چائل تھریڈ پیرنٹ تھریڈ سے پڑھا پہلی اس کی کمپلیشن ہو اور ایسا بھی ہو سکتا ہے کہ کافی دیتا ہے چائل تھریڈ جو اس کی ایکسیوشن ہی نہ ہوں اور بہت آگے جاکے کہیں اس کی ایکسیوشن جو ہے وہ پرکرس کریں تو کوئی بھی پوسیبلیٹی ہو سکتا ہے آپ کو آپ کی جو کوڑ ہے اس کو ہر پوسیبلیٹی کے لیے کیا رہنا چاہی ہے اگر For example ملٹی پروسیسسٹم ہے اس کے اندر ایک چائل تھریڈ ہے اور ایک پیرنٹ تھریڈ ہے تو یہ بھی پوسیبل ہے کہ دونوں تھریڈ جو ہیں وہ کنکرنڈ لیے ایکسیوٹ کر رہی ہے ایک پروسیسسٹر کے پر چائل تھریڈ ایکسیوٹ ہو کر رہی ہے تو ایک کے پر پیرنٹ تھریڈ ایکسیوٹ کر رہی ہے اور دونوں کی سال ساتھ ایکسیوشن ہو رہی ہے تو اس کے بارے میں آپ کوئی بھی ازمشن نہ لیں پھر یہ بہت ضروری ہے کہ ایک تھریڈ نے جو دیتا استعمال کرنا ہے تھریڈ کے کریڈ کرنے سے پہلے وہ دیتا اویلی بل ہو اگر آپ تھریڈ کریٹ کرتے ہیں اور دیتا اویلی بل نہیں ہے اور آپ ازیم کرتے ہیں کہ بعد میں کسی point پہ جاکے وہ دیتا اویلی بل ہو جائے گا اور تھریڈ اس کو use کر لے گی تو اس کی وجہ سے آپ کا کام خراب ہو سکتا تو آپ نے اس طرح کی ازمشن نہیں کرنی آپ نے create تھریڈ کو call کرنے سے پہلے اس کے پرامیٹر کی اندر جو بھی اس کو دیتا رکھا ہے وہ pass کر دینا ان کس اگر وہ دیتا اویلی بل نہیں ہے تو آپ نے کوئی ایسی پرامیٹ گیوز کرنی ہے جس ہے کہ تھریڈ سیسپنڈ ہو جائے اور وہ تب تک سیسپنڈ رہے جب تک دیتا اویلی بل نہیں ہو جاتا ہم نے previous کچھ پرامیٹ کے اندر ایسی تکنیٹ گیوز بھی کی تھی اگر کوئی تھریڈ جو ہے وہ ایسے دیتا کو access کرنے کی کوشش کرتا جو کہ ابھی اویلی بل نہیں ہے تو اس کی وجہ سے کئی conflicts exist آ سکتے ہیں اور اس conflict کو آپ کو بتا ہے ہم race condition بھی کہتے ہیں تو یہ بہت ضروری ہے کہ جو تھریڈ کو data required وہ اس کو صحیح طریقہ سے creation کے وقتی pass کر دیا جائے کوئی اس چیز کی زمشہ نہ کی جائے کہ یہ تھریڈ پہلے کمپلیٹ ہوگی یہ تھریڈ اگر number of threat زران ہو رہی ہیں تو ہم بزیم کریں کہ یہ تھریڈ پہلے کمپلیٹ ہوگی تو یہ جو دیتا output کرے گی اس کو دوسی تھریڈ use کرنے کی ایسی کوئی زمشہ نہیں چاہیے آپ نے جب بھی اس تھریڈ کو ران کیا چاہے پہلے ران کیا چاہے بعد میں ران کیا آپ یہ نہیں انڈیٹمین کر سکتے کہ کونسی تھریڈ جہاں اس کی execution کب کمپلیٹ ہوگی تو اس کی completion کے بارے میں کسی کسم کی آپ ازمشہ نہ کریں کبھی بھی کوئی threat جہاں وہ preempt ہو سکتی ہے operating system ہے اس کا جو slot ہے اس کی جو بھی اس کے مطابق اس کی slot پوری ہو جائے گی تو وہ preempt ہو جائے گی اور ہوسکتا ہے کہ ایک threat جو ہے وہ ready state کے اندر ہے وہ اپنی execution کے لیے تیار ہے تو کسی بھی instance پر اس کی باری آسکتی ہے یا even blocked بھی ہے تو جس input output کو weight کریے وہ اکر ہوتی ہے اور وہ کسی بھی instance پر اس کی تہان آسکتی ہے یہ ازیم کرنا کہ پہلے کونسی ختم ہوگی بعد میں کونسی ختم ہوگی اور یہ ازیم کرنا کہ پہلے کونسی preempt ہوگی اور بعد میں کونسی رزیم ہوگی ایسی کوئی ڈمشن آپ کو نہیں کرنی چاہے یہ program اس طرح سے لکھا جائے کہ کوئی بھی کبھی بھی preempt ہو سکتی ہے کبھی بھی اگر ازیم ہو سکتی ہے اور پھر یہ دو terms ڈیوز ہوتی ہے ایک synchronization اور ایک priority تو یہ کچھ لوگ ان کو سیم چیز سمجھتے ہیں ایسے نہیں ہے priority ایک different چیز ہے ہم نے last time priority کی بات کی تھی کہ آپ اپنی thread کی priority جو ہے وہ define کر سکتے ہیں جب آپ the thread کو create کرتے ہیں synchronization ایک alag concept ہے synchronization کی اندر اگر آپ چاہتے ہیں ایک thread جو ہے وہ پہلے execute ہو اور اس کا ایک operation perform ہونے کے بعدی کوئی دوسی thread اپنا اگل operation start کریں تو پھر آپ ان دونوں threads کو کسی طریقہ سے synchronize کرتے ہیں تو synchronization اور priority کا اپس میں اس طرح سے کوئی direct link نہیں ہے اگر single threaded program ہوں تو آپ کو بہت practice ہوگی single threaded programs کی debugging کرنے میں ان کو test کرنے میں validate کرنے میں لیکن اگر multi threaded program ہوتے ہیں تو اس کی debugging کرنے یا اس کی testing جو ہے وہ تھوڑی سی complicated ہوتی ہے اور ہو سکتا ہے کہ جو آپ کے عام validations ہیں آپ کو program سارا pass کرتے ہیں لیکن پھر بھی program کے اندر ابھی بھی code کے اندر کچھ defects ہوں تو اس لحاظ سے آپ کو مختلف ایسی conditions دے کے آپ کو اپنے program کو اس طریقے سے test کرنا چاہئے کہ کوئی بھی order بن رہا ہے مختلف ایسی order بن رہے ہیں of threads جس کے اندر وہ execute کریں تو وہ ہر order کے اندر آپ کا program جو ہے سی perform کر سکے اس کا ایک طریقہ یہ ہے کہ اس کو مختلف systems کے پر try کیا جا ہے کہ آپ کے نمبر of processors ہیں آپ کی جو memory ہے آپ کا جو operating system کا version ہے وہ چینج ہونے سے بھی thread کی execution کے اوپر یا اس کے order کے اوپر یا اس کے sequence کے اوپر فرق پڑتا ہے تو اس کو مختلف systems کے اوپر check کیا جا ہے اور اگر کوئی ایک ایسا certain flow اس کا بنت ہے جس کے اندر error ہونے کے chance ہے تو وہ آپ کی ہو سکتا کہ نظر میں آ جا ہے تو اس لئے مختلف اس کے پر try کرنی پڑتی ہیں اس طرح سے نہیں ہے کہ بس وہ جو simple ہمارا طریقہ ایک program کو test کرنے کا اگر وہ test pass ہو جاتا ہے تو آپ کہیں کہ یہ آپ کا program سے یہ ہے ابھی بھی اس کے اندر error ہونے کے chance ہے کیونکہ اس کے جترے بھی possible permutations of flow of execution وہ صحیح طریقے سے ہو سکتا ہے کہ آپ چکنا ہو سکتی ہیں پھر یہ بھی ایک بہت important factor ہے کہ آپ کو stack کا سائیز ہے اس کو بھی optimize رکھنے کی ضرورت ہے by default جو stack کا سائیز ہے وہ one mb ہوتا ہے تو آپ نے جو بھی operations perform کرنے اس کے according لی آپ دیکھیں کہ جو stack سائیز ہے وہ sufficient ہے یہ نہیں ہے عام طور پہ most of the cases کیلی ہے one mb جو ہے وہ sufficient ہوگا لیکن پھر بھی اگر آپ نے بہت اس طرح کے program کرنے ہیں جس کے دا recursive calls ہے اور بہت ادا calls ہیں تو وہاں پہ ہو سکتا ہے آپ کو زیادہ stack memory کی بھی ضرورت پڑے پھر you should use the stacks when you really need concurrent processing when you really need it اگر آپ نے کوئی sequential operations perform کرنے ہیں جس میں کوئی concurrent چیز ہی نہیں ہے کہ جسے اگر آپ نے a operation perform کرنا ہے ایک ارزالٹ آئے گا تو b کرنا ہے b کرزالٹ آئے گا تو c کرنا ہے یہ تین اوپرشن اپس میں انٹرلنگتا ہے تو ab اور c کو الگلک threads کے اندران کرنے کی آپ کو ضرورت نہیں ہے ایسا کرنے سے کیا ہوگا maybe output آپ کی تھیک آئے لیکن آپ resources ڈادہ consume کر رہے ہوں گے switching ہو رہی ہوگی switching کے overheads ہوں گے tls کے لیے memory required ہوگی اور بیشمار کسیم کے بیچ میں overheads آسکتے ہیں تو بلا وجہ threading کا استعمال کرنا use less ہے اگر آپ بہت زیادہ threads use کر رہے ہیں تو threads وہ virtual memory کہلیں کہ بہت زیادہ استعمال کرتے ہیں کیونکہ اس کے ساتھ کئی سارے overheads لنگت ہیں تو اگر بہت زیادہ آپ threads use کر رہے ہیں تو آپ کو پھر virtual memory کے بارے میں بھی conscious ہونا چاہیے کہ تینی زیادہ آپ threads use کریں کہ آپ کی virtual memory جو ہے وہ بھی ساری consume ہونا جائے جو اس کے overheads ہیں وہ اتنی آپ کو threads بنانی چاہیے جتنے اس کے overheads وہ accommodate کیا جا سکتے ہیں آپ کی memory سسٹم کے اندر تو بلا وجہ threading سے program کو complex بنانا جو ہے وہ کوئی اتنا proven نہیں ہے اگر آپ کا program simple ہے تو بلا وجہ اس کے اندر تر threading ڈالنے کی ضرورت نہیں ہے اگر آپ threading ڈالتے ہیں تو اس کو بھی آپ simple رکھیں اس کو بھی زیادہ complicate کرنے کی ضرورت نہیں ہے