 بسم اللہ الرحمن الرحیم آج ہم موڈیول 170 دیسکرس کریں گے موڈیول 170 ہے about using thread pools پریویس لی ہم نے دیکھا کہ اپٹیمائیزیشن کے لیے ہم thread pools کے استعمال کرتے ہیں اس کے لیے ایک سٹن سیٹ آف ایپی آئیز ہیں جو کہ thread جو ایک worker object کو کریئٹ کرنے کے لیے اس کو رجسٹر کرنے کے لیے اور call back functions لکنے کے لیے اور call back functions کے لیے use ہوتی ہیں تو ان اپی آئیز کو ہم اپنے programs کے اندر کیسے use کر سکتے ہیں تو یہ ہم دیکھیں گے اب ایک example کی مدل سے وہ example ہم نے کیسے بنائی ہے کہ ہم نے ایک threading previously threading کے لیے جو function use کیا تھا program use کیا تھا اسی کو modify کر لیا اور بڑا easily modify ہوگیا اور اس کو modify اس طریقے سے کیا ہے کہ رہا than کہ ہم threads بنائے اون threads کو manage کریں ہم کیا بنارے ہیں worker object بنارے ہیں اور call back functions لکنے اور اس طرح کرنے سے ہمیں threads کو بھی manage کرنے کی زوت نہیں پڑی جب thread pool use کریں تو ان کو operating system یا kernel جو ہے وہ خود سے manage کرا باکی جو call back function اس کی programming بھی آپ سمجھتے ہیں کہ call back function جو ہوتا ہے وہ بالکل جو basic windows کی programming ہے اس کے اندر آپ نے دیکھا ہوگا وہ ایسا function ہے جس کو کے program خود سے نہیں call کر رہتا program سے بہر کوئی چیز اس کو call کر رہی ہوتی ہے for example operating system جو ہے وہ call back function کو call کر سکتا ہے جب بھی کوئی message send ہوتا ہے to a process تو a call back function ہوتا ہے وہ call ہوتا ہے جس کے اندر کے اس کی processing ہوتی ہے تو یہ windows program مرس کے لیے کوئی نئی چیز نہیں ہے call back function تو ہم اس call back کی function کی programming جو ہے وہ دیکھیں گے یہاں پروٹو طائم دیکھ سکتے ہیں ہمارے call back function کا اس کے اندر آپ دیکھ سکتے ہیں وہی instance اور آپ کا a pv اور work object یہ تین اس کے اندر parameters ہیں اس کے لوہ worker tray trace flag جو آپ کے variables ہیں main program کے اندر دیکھیں یہاں پر ہم نے srw lock جو ہے اس کا استعمال کریں تو جو synchronization ہے یا mutual exclusion اس کو enforce کرنے کے لیے ہم srw lock use کریں گے اور اس کے ساتھ پھر ہم thread pools یعنی کہ srw lock اور thread pool کا combination ہم use کریں تو یہاں پر یہ اپنے call back environment کا variable call back environment کے نام سے cb create کر لیا اور argument ساپنے لیے اس کے اندر آپ کو argument pass کریں argument one argument simple check ہے کہ جی argument جو ہے وہ پورے ہیں یا نہیں ہے جو srw lock ہے اس کو آپ نے یہاں پے initialize کر لیا اور جو work objects ہیں work objects کے لیے آپ نے ایک array کے لیے memory جو ہے وہ allocate کر لیا یہاں پر ایک single work object کے لیے آپ نے memory allocate کر لیا اور یہاں پر یہاں پر آپ نے اس کو use کرتے بے ایک array بنا لیا آپ یہاں پر دیکھیں اگر thread pool environment کا آپ استعمال کر رہے ہیں تو initialize thread pool environment یہ آپ کو یہاں پر thread pool environment پلے create کرنے پڑے گی اور پھر یہ آپ کا جو loop ہے جس کے اندر کے آپ previous جو threading والا program تھا جس کے اندر کے آپ threads کو باری باری create کرتے ہیں وہ تھوڑا سا آپ دیکھیں modify ہو گیا اس کے اندر اسی طرح سے ہم نے objects جو بھی اس کے parameters ہیں values ہیں task to complete اور جو ہمارا lock ہے ساری بالکل exactly ہوئی ہے جو نئی چیز ہے اس کے اندر ہم نے یہ ایک object بھی رکھ دیا this is the create thread pool work یعنی کہ worker object ہم نے یہاں پر create کیا جس طرح سے کہ وہ باقی data کی array جو ہے maintain کی جا رہی ہے اس کے ساتھ ہم نے ایک اپنے worker thread ہے اس کی بھی worker object جو ہے اس کی بھی ایک array maintain کر لیا اور پھر ہم اس کو اگر سب کچھ صحیح نال نہیں آیا صحیح تری کیسے create ہو گیا worker object تو ہم کیا کریں اس کو submit کریں یعنی کہ windows کی پاس ہم نے اس object کو register کر دیا اس کو بتا دی ہے کہ یہ ہمارا باقی worker object ہے اور اس worker object وہ register ہو گیا تو اب windows جب اس program کو run کرے گی تو اس نے اس worker object کا call back function ہے اس کو map کرنا ہے on to the thread pool یہاں پہ ہم wait for objects کی جگہ ہم use کرے ہیں wait for thread pool work call backs تو ہم یہ دیکھ رہے ہیں کہ جو ہمارے object worker ہم کی callback functions جو وہ return ہوئے یعنی ہوئے جب تک وہ return نہیں ہوتے یہاں پہ یہ wait کرتا رہے گا یہ آپ کا for loop ہے یہ wait کرتا رہے گا یہ باری باری اس کے اندر سارے ہر thread کے لیے ہم نے اس کے worker object کا reference pass کیا اور اس کا دیکھ رہے ہیں callback function جو وہ return ہوئے یعنی ہوئا جب ساروں کا return ہوگیا ہوگا تو یہ loop جو یہ break ہو جائے گا اور پھر اسی loop کے اندر جس کا b callback function return ہو جاتا تو اس کو ہم close کر دیتے ہیں اس کا جو worker object ہے اس کو ہم close کر دیتے ہیں اور پھر اسی طرح سے اس loop کے اندر بھی آپ دیکھ سکتے ہیں بالکل وہی processing ہے جو previously ہم processing کر رہتے ہیں اس کے اندر یہ count ایک maintain کر رہتے ہیں بالکل اسی طرح سے count کو maintain کیا اور جو رے ہم نے create کی تھی اس رے کو یہاں پہ ہم deallocate کر رہے ہیں اب جو different چیز یہ ہے کہ ہمارے پاس thread کا function نہیں ہے ہمارے پاس کیا ہے یہ callback function ہے یہ callback function ہے اور یہ callback function جو ہے یہ register ہوئے windows کے پاس through the worker object جب بھی اس کو schedule کرنے کی ضد پڑتی ہے ایک thread کو تو وہ دیکھے گا اس callback function کا کیا address ہے اس callback function کو call کرے گا worker object کی callback function کا کیا address ہے اس callback function کو call کرے گا اور یہ callback function جو ہے اپنی execution start کردے گا اب یہ دیکھیں یہاں پہ یہ increment کر رہا ہے اور اس سے پہلے srw کی مدل سے آپ نے اس کو lock کیا اور یہاں پہ اس کو release کر دیا increment کرنے سے پہلے اس کو lock کیا اور پھر اس کو آپ نے release کر دیا تو یہ اس callback function کے اندر سمplی یہ ایک loop ہے اس loop کے اندر آپ جسنا previous thread کے اندر increments کر رہے تھے اور آپ نے srw lock کو use کرتے ہوئے ہی اس ویریہ بالکو جو ہے lock کیا ہوتا تو آپ نے بالکل اسی طرح سے یہ دل lock کیا ہوا بالکل جو exact thread کی processing ہے وہ processing آپ نے اپنے callback function کے اندر place کر دیا اب یہ callback function جو ہے جب map ہوگا onto a thread within the thread pool تو اس کی execution بالکل اسی طرح سے ہوگی جس طرح سے thread کی اندر ہو دیتی تو یہاں پہ آپ دیکھ سکتے ہیں کہ بہت تھوڑی changes ہوئی ہے آپ کو تھوڑا سا program change کرنا پڑا ہے بجائے اس کے کہ آپ ایک thread create کریں اور thread کو manage کریں آپ نے کیا کیا ہے کہ آپ نے callback function بنانا لیا آپ کو threads create بھی نہیں کرنی پڑیں ان کو end بھی نہیں کرنا پڑا threads کو manage کرنے والا کام آپ کا ختم ہو گیا just آپ کس چیز کو manage کریں آپ worker objects کو manage کریں اور worker objects کی جو mapping ہے onto a thread وہ بھی operating system take care کر رہا operating system خود سے دیکھتا ہے کہ اپنی scheduling policy کیمتابق کس worker thread کو map ہونا چاہیے onto a worker object کو map ہونا چاہیے onto a thread اس کو map کرتا ہے اور اس کی scheduling کرتا ہے تو اس کے بیچ میں جو concurrency ہے اس کو operating system جو ہے وہ manage کر رہا ہے اور آپ نے جو کام آپ کی زمداری ہے وہ یہ ہے کہ mutual exclusion آپ نے ابھی بھی enforce کرنی ہے تو یہاں پہ آپ یہ srw locks کو use کرتے ہیں mutual exclusion آپ اسی طرح سے enforce کر رہے ہیں جو گلت فیمی ہوتی ہے وہ یہ ہوتی ہے کہ جی thread pool mutual exclusion enforce کرنے کا طریقہ نہیں mutual exclusion کو enforce کرنے کا طریقہ نہیں ہے mutual exclusion کو optimize کرنے کا طریقہ enforce کرنے کی ابھی بھی ضرورتا ہے یہ enforce نہیں کارا یہ اس کو optimize کارا