 بسم اللہ الرحمن الرحیم آج ہم موڈیول 169 دسکس کریں گے موڈیول 169 ہے is about thread pool API's previously ہم نے thread pools کو دسکس کیا تھا اور concurrency کو ہم نے کافی detail میں دسکس کیا تھا تو ہم نے دیکھا ہے کہ جب ہم concurrency کی objects کو use کرتے ہیں تو ان objects کی use کرنے کا تو ضروری ہے کیونکہ ہم نے mutual experience can force کرنا ہے لیکن جب use کرتے ہیں اس کی وجہ سے مزید certain constraints آتے ہیں اور ان constraints کے جو overheads ان کو کم کرنے کی ہم کوشش کرنا ہے جن میں سے اس constraints کے overheads کو reduce کرنے کا ایک طریقہ جو ہے that is thread pool تو thread pool ہم نے دیکھا ہے کہ اس کے اندر کیا ہوتا ہے کہ ہر process کے پاس ایک thread pool ہوتا ہے اور جو بھی ایک worker ایک function بنتا ہے worker object بنتا ہے وہ thread pool کے اندر جو بھی threads پڑی می ان کے ساتھ کسی طرح سے associate ہو جاتا ہے یہ thread pool manage کرنے کے لیے of course کیا چیز استعمال ہوگی ایک certain set of apis use ہوں گے اور یہ set of apis use ہوں گے اس کی اب ہم detail جو ہے وہ دسکس کرنے لگے یہ apis دیکھتے ہیں اس کے اندر سب سے پہلے apis ہے create thread pool work یہ ایک worker object کرنے کے کام ہوتا ہے اس کے اندر آپ دیکھ سکتے ہیں کہ تین پیرامیٹرز ہے pf and wk جو ہے this is pointed to the callback function یعنی کہ آپ ایک callback function بنائیں گے اپنے program کے اندر اور اس callback function کا جو pointر ہے اس کا جو address ہے وہ آپ نے یہاں پر سپیسفائے کرنے گے callback function جو ہے یہ ماب ہوگا ultimately onto a worker thread جو کے process کے پول کے اندر threads ہیں اس پولز میں سے جتیم بھی thread ان میں سے کسی ایک worker thread کے اوپر ماب ہوگا اس function اے اس thread کے اندر execute ہونا پیوی ہے پیوی ہے یہ ایک value ہے جو کہ اس کو identify کرنے کے لیے پاس کی جاتی ہے اور pcbe جو ہے this is tp callback environment structure یہ structure وہ structure ہے جو کہ اس کو identify کرنے کے لیے استعمال ہو رہا usually اس کے لیے آپ default value جو ہے سپیسفائے کر سکتے ہیں اب اس function کو دیکھیں اس function کی ایک return type بھی ہے یہ return type کیا چیز ہے یہ آپ کے آپ کا work object ہے thread pool work object اس کو ہم کہہ رہے ہیں اس object کو use کرتے ہوئے basically identify کیا جاتا ہے کہ کونسا callback function جو ہے اس کو execute کرنا ہے ہر worker object کے ساتھ ایک callback function associated ہے اور پھر وہ worker thread جب map worker object جو map ہوتا ہے onto a worker thread تو اس کا جو callback function ہے وہ execute ہوتا ہے اور یہ جو return value ہے return value null ہوگی in case of failure اگر کسی وجہ سے work object نہیں create ہو پایا تو اس case میں کیا ہوگا کہ value جو return ہوگی that will be null جو انٹکیٹ کرتا ہے کہ worker object کسی وجہ سے create نہیں ہو پایا دوسری جو ہے that is submit thread pool work یہ previous api جو ہے وہ تو worker object کرنے کے لیے use ہو رہی ہے یہ والی api جو ہے once ایک object create ہو جاتا ہے اس کو windows کے اندر register کرنے کے لیے use ہو رہا یہ بتانے کے لیے کہ یہ جو object ہے یہ ہمارے process کا ایک worker object ہے جس کو کے thread pool کے اوپر map کیا جائے گا جب جتریں بھی اس طرح کے worker objects جو ہے register کیا جاتے ہیں for that process for a specific process تو windows وہ جتریں بھی worker objects register ہوئے میں ان worker objects میں سے وہ decided کرتا ہے کہ کس worker object کو اس نے thread کے اوپر map کرنے اور کس order کے اندر map کرنے کیا ان کا schedule رکھنا ہو سکتا ہے آپ نے 10 worker objects جو ہے وہ register کیا جبکہ thread pool کے اندر 4 threads ہیں تو اس کو کوئی ایک schedule بنانا بڑھائے گا کہ پہلے کس کو اس نے schedule کرنا thread کے اوپر next کس کو کرنا next کس کو کرنا and so on کسی order کے اندر تو یہ کیا order ہوگا یہ آپ پہلے سے ڈیٹمینی کر سکتے یہ run time کے اوپر جو windows کا kernel ہے وہ اس چیز کو ڈیٹمین کرتا ہے کہ جو جو آپ نے worker objects بنائیں ان کو کس order کے اندر کس schedule کمتابک جو ہے thread pool کے اوپر map کرنا جو ایک call back function ہے جب بھی ایک worker object کی باری آ جاتی ہے جب آپ کا kernel ڈیسائٹ کرتا ہے کس worker object کی turn آگی ہے اس کا جو call back function ہے وہ map ہوتا ہے onto a thread اور وہ thread جو ہے اس call back function کو execute کرنا شروع کر دیتی ہے گیا آپ کو schedule ڈیٹمین کرتا ہے کہ جی کس کو execute کرنا جو جو یہ جو worker threads ہے یہ ایک طرح سے programmer سے hidden ہے programmer کو ان threads کو manage کرنے کی ضرورت نہیں ہے کہ ان کو end thread کرے ان کو create کرے ایسا کرنے کی اس کو ضرورت نہیں ہے یہ سارے کام schedule کر رہا ہے kernel کر رہا جو programmer ہے اس سے یہ چیزیں hidden ہے لیکن of course آپ کے program کے اندر یا call back function کے اندر جہاں کی mutual exclusion enforce کرنے کی ضرورت ہے یا synchronization enforce کرنے کی ضرورت ہے وہ آپ نے کرنی ہے جو جو objects ان کو use کرتے ہوئے وہ آپ نے اسی طرح سے کرنی ہے اور اس case میں آپ عام طور پر slim read write objects کو use کریں گے ان کو use کر کے آپ نے mutual exclusion enforce کرنی ہے لیکن threads کو manage کرنا وہ programmer کا ایدر کام نہیں آتا تو یہ طرح سے اور اسانی ہو جاتی ہے programmer کے لیے کہ اس نے threads کو manage نہیں کرنا پھر یہ ایک اور function ہے یہ بڑا important function ہے wait for thread pool work callbacks اب ایک آپ کا program ہے اس کے اندر کئی ساری worker objects ہیں اور ان worker objects کو آپ نے create کیا اور پھر آپ نے ان کو submit کر دیا register بھی کر دیا اب وہ کسی order کے مطابق execute ہو رہے ہیں threads کے پر map ہو رہے ہیں callback functions call ہوتے ہیں ختم ہوتے ہیں اگلا callback function map ہوتا ہے ختم ہوتا ہے and so on کئی callback functions جویں باری باری execute ہو رہے ہیں اور اپنی execution complete کریں لیکن آپ کو اپنے program کے اندر یہ دہنے کی ضرورت ہے کہ callback functions جویں قب سارے ختم ہو جاتے ہیں آپ کو یہ identity کرنے کی ضرورت ہے کہ ایک سٹن point جس point کے اوپر جی جب تمام callback functions complete ہو جاتے ہیں تو وہاں سے onwards اس نے اپنی کوئی execution pick up کرنی ہے جساں previously ہم نے دیکھا تھا previously wait for object بھی تھا ہمارے پاس ایک function تو وہ کسی ایک object care signal ہونے کا wait کرتا تھا جب سارے signal جاتے تھے وہاں سے پھر execution continue کرتا تھا بالکل exactly اسی طرح سے ہی یہ کام کر رہا ہے لیکن اس کے اس کے اندر یہ callback functions کے complete ہونے کا انتظار کر رہا ہے اس function کے اندر آپ کے پاس کوئی time out نہیں ہے اس function نے callback function کی complete ہونے کا wait کرنے کیا ہر صورت کرنا ہے سارے callback functions جب complete ہون گے تو تبھی of course execution آگے continue ہو سکے گی پھر اس کے لہاں یہ اتنا ضرور ہو سکتا ہے کہ ہو سکتا ہے کچھ ایسے callback functions جوکہ ابھی wait کریں map ہونے کے لیے map ہونے کے لیے on to a certain thread تو اگر ابھی ان کی execution start نہیں ہوئی تو وہ جو pending callbacks ان کو اب all together cancel کر سکتے ہیں تو یہ آپ کو پر اس جو سیکنڈ option ہے اس کے اندر سیکنڈ جو پیرامیٹر ہے اس کی مدر سے آپ جو pending callbacks ان کو cancel کر سکتے ہیں وہ all together اگر start نہیں ہوئے تو وہ cancel ہو جائیں گے ان کی execution complete نہیں ہوگی اور سب سے importantly یہ آپ دیکھ سکتے ہیں کہ یہ callback function لکھنے کا طریقہ یہ callback function وہ function ہے جس کے اندر کیا آپ کی ساری processing ہوگی جو آپ اپنی thread کے اندر processing کرنا چاہتے تھے وہ ساری processing اس کی ساری code جو آپ اس callback function کے اندر place کریں گے اس میں آپ دیکھ سکتے ہیں کہ جو context ہے context جو second parameter ہے وہ کیا چیز ہے وہ وہ pv value ہے جو کہ آپ کو receive ہوئی تھی جب آپ نے work object کو create کیا تھا create کرنے پہ وہ آپ کو value is جو receive ہوئی ہے وہ ایک reference تھا اور وہ value value جو ہے that is context context کے اندر آپ وہ value pass کریں گے اور جو work ہے وہ آپ کا work object ہے جو آپ کو return ہوا تھا جب آپ نے create اس کو کیا تھا تو object return ہوا تھا تو اس کا جو reference ہے that is work اور instance جو ہے وہ آپ کے callback function کا instance ہے اور اس instance کے اندر ایسی information ہے جس کی مدد سے آپ کا جو scheduler ہے کرنے کا جو scheduler ہے وہ اس instance کی information کو use کرتے ہوئے اور سارے جتنے بھی دوسرے work object سے ان کے instance کی information کو use کرتے ہوئے اپنی scheduling performance کرتا تو scheduling performance کرنے کیلئے اس کو instance کی information چاہیے ہوئی ہے ان case عام طور پر بیسے جب thread pool کو use کرتے ہیں تو callback functions ہے بلکہ otherwise بھی callback functions جو ہیں وہ اس طرح سے لکھے جاتے ہیں کہ وہ جلدی return کرتے ہیں بہت زیادہ execution perform نہ کریں بہت زیادہ computations perform نہ کریں لیکن اگر آپ کو لگتا ہے آپ کا کو callback function ایسا ہے جو کے زیادہ time consume کرے گا اس کے اس کے اندر callback may run long یہ option جو ہے وہ آپ use کر سکتے ہیں اس option کو use کرتے ہوئے آپ windows کو basically یہ بتا رہے ہیں کہ آپ کا جو callback function ہے وہ ہو سکتا ہے زیادہ دیر تک computations perform کرتا ہے