 بسم اللہ الرحمن الرحیم آج ہم موڈیول 152 دسکریں گے موڈیول 152 ہے about producer consumer problem اس کا ہم سلوشن پروائیڈ کریں گے using events previously ہم نے اس problem کو solve کیا تھا different objects use کرتے ہوئے اب ہم events کی مدد سے اس problem کو solve کرنے کی کوشش کریں گے جس طرح آپ کو بتا ہے یہ کلاسکل problem ہے اس کے اندر کیا ہوتا ہے کہ ایک thread ہے جس کو کہ ہم کہتے ہیں producer thread اور ایک اور thread ہے جس کو کہتے ہیں ہم consumer thread یہ دونوں threads concurrently run کریں گے producer کا کام ہے produce کرنا وہ ایک آپ کے پاس buffer ہے اس buffer کے اندر items add کرتا ہے consumer کا کام ہے وہاں سے items کو remove کر کے use کرنا consume کرنا تو یہ دونوں concurrently چال رہے ہیں اور پھر ان کو کسی طرح سے ہم اس synchronize بھی کرنا پڑتا ہے اور mutual exclusion کو بھی enforce کرنا پڑتا تو اس سلوشن کو ہم solve کریں گے using mute axis اور ساتھ ہم events use کریں گے mutual exclusion کے لیے اس کیونکہ جو share data ہے share data کو access کرنے کے لیے جو ہمیں share data کی access ہے وہ mutually exclusive بنانی پڑے گی اس کو mutually exclusive بنانے کے لیے ہم mute axis کا استعمال کریں گے اور پھر جب producer جب بھی produce کرتا ہے تو consumer کو ایک message pass کرے گا اس message کو ہم pass کریں گے through events consumer کو کیا message جائے گا کہ جی اب ہمارے پاس ایک item produce ہو گیا تم consume کرنا چاہتے ہو تو اس کو consume کرنو اس طرح سے یہ ہم اس کو کیسے signify کریں گے ہم کیسے یہ message اس تک پہنچائیں گے consumer تک اس کے لیے ہم events کا استعمال کریں گے auto reset event use کریں گے کیونکہ single consumer involved اور set event کی مدل سے جب بھی producer produce کرے گا تو وہ set event کی مدل سے consumer کو signify کر سکتا یہ item produce ہو گیا اور اس کو consume کر لیا جائے پھر اس کے اندر ایک data structure ہے ایک buffer ہے جس کے اندر کے جو بھی produced item ہے تو اس کی access کو mutually exclusive بنایا گیا اس کی access کو mutually exclusive بنانے کے لیے mute access کا استعمال کر جائے گا جب بھی اس کے اندر ایک نیا message place کرنا mute access اس کو lock کر جائے گا یا جب بھی اس میں ایک item نکالنا ہے mute access کی مدل سے اس کو mutually exclusive بنائے جائے گا اس کی code دیکھتے یہاں پر آپ دیکھ سکتے ہیں یہ جو ہم نے structure بنائے اب اس کے اندر دو objects define ہوئے ایک m guard m guard جو ہے وہ mutex ہے یہ mutex you have mutual exclusion enforce کرنے کے لیے use okay اور ایک m ready ہے m ready جو ہے یہ auto reset event کے طور پر use ہوگا auto reset event پتانے کے لیے کہ یہ ایک item جو ہے وہ produced ہو گیا اور اس کو consume کر لیا جائے اور جس طرح previous لیے ہم نے use کیا تھا f ready اور f stop جو ہے یہ ہمارے flags ہیں یہ جو بھی ہمارے threads ہے ان کی state کو sacrifice کرنے کے لیے اور sequence جو بھی item produce ہوتا ہے اس کو ایک sequence number اور اس کے لیوہ checks some time stamp اور data وغیرہ جو بھی ساری چیزیں اب اس کے اندر ہمارے پاس دو threads ہیں ایک thread produce ہے ایک thread consume ہے باقی دوسرے functions ہیں جس طرح یہ message fill message display ان کو ہم نے previously بھی discuss کیا تھا یہ message کو fill کرنے کے لیے or display کرنے کے لیے simple functions ہے لیکن ہمارے بسکلی یہ دو threads ہیں produce اور consume ان دونوں threads کے بیچ میں ہم نے synchronization اور mutual exclusion کو جو ہے enforce کرنا ہے using mutex and events اب a main کی اندر دیکھیں main کی اندر ہم کیا کرتے ہیں main کی اندر ہم ایک mutex create کرتے ہیں جو بھی mutex create ہوئی ہے اس کا handle m guard کے اندر place کر دیا اور ایک event کریٹ کیا ہم نے handle m ready کے اندر place کر دیا اور ایک thread begin کی اس کا handle h produce میں آگیا یہ producer thread ہے یہ والی producer thread ہے اس کو begin thread کر دیا اور ایک اور thread begin کی یہ consumer thread ہے اور اس کا handle h consume کے اندر ہم نے place کر دیا اب wait for single object کس کے لئے consume consume کے لئے wait کرے اور wait for single object produce دونوں کے لئے wait کرے اب یہ دونوں threads چل رہی ہیں جب تا یہ دونوں threads complete نہیں ہوں گی یہ execution ختم نہیں ہوں گی اور یہاں پر آپ کا main program جو ہے چل رہے ہیں یہ دونوں threads basically چل رہی ہیں جب یہ دونوں threads complete ہوں گی اس کے بعد یہ main complete ہوگا اور execution onwards آئے گی جو بھی اس کے بعد report یہاں پر close handle کیوں پر آئی گی report error دو تب ہے جب ان case کوئی error آتا یہ اگر سائی تری کیسے wait نہیں کر پاتا کسی وجہ سے فیل ہو جاتا اب produce produce کے اندر دیکھیں ہم نے mutual exclusion کو basically چیک کرنے کہ mutual exclusion کیسے enforce ہو رہی ہے اور synchronization کیسے enforce ہو رہی ہے تو اس کے لئے آپ دیکھیں کہ یہاں پر اس نے m guard wait کیا wait call کیا over m guard m guard کیا چیز ہے m guard آپ کی mutex ہے اور finally close کے اندر اس نے release mutex کیا یہاں پر اس نے wait mutex کیا mutex کے پر wait کر رہا اور یہاں پر release کر رہا اس کا مطلب ہے اس کے اندر جتنی بھی code ہے ان دونوں construct کے بیچ میں اس کے اندر یہاں سے لیکے جو try کے اندر جتنی بھی code ہے یہ ساری یہ code جو ہے you are mutually exclusive ہو گی دونوں threads اس part of the code کو concurrently execute نہیں کر سکتا اور اس code کے اندر کیا کیا جا رہا ہے وہی مسج کو فل کیا جا رہا ہے یہاں پر ایک مسج بنے گا مسج بنانے کے بعد ready کو اس نے one کر دیا اور increment یہاں پر enter logged increment اور یہاں پر دیکھیں کہ set event set event am ready کیا پر وہ set event کر رہا ہے اس کا مطلب ہے کہ اس نے ایک مسج کریئٹ کر دیا اب وہ consumer کو پتا رہا ہے کہ وہ مسج کریئٹ ہو گیا اور اب تم چاہتا تو اس structure میں سے اس مسج کو retrieve کر سکتے ہیں اس کے result میں اگر consumer wait کر رہا ہو گا دیکھیں یہ consume کی code کی اندر بھی consume کی code کی اندر بھی یہ wait کا ہے اور یہ same mutex کیا پر wait کر رہا ہے am guard کیا پر wait کر رہا ہے اگر consumer wait کر رہا تھا تو consumer کیا ہو جائے گا consumer وہ اپنی execution continue کرنا شروع کر دے گا consumer release ہو جائے گا اور release ہونے کے بعد پھر جو item create ہوا ہے اس item کی جو value ہے am block کے اندر جو بھی value اس کو ملتی ہے sequence number ملتا اور am block کے جو بھی contents ہیں ان کو وہ display کر سکتا یہاں پر دیکھیں اس نے wait call کیا am ready کیا پر and wait call کیا am guard کیا پر یہاں پر بسکلی آپ کے پاس دو options ہیں ایک option c کیا ہے گی ایک option s کیا ہے گی آپ use سے input لیتے ہیں جب consumer run ہوتا ہے وہ پوچھے کا stop کرنا ہے یا consume کرنا ان کے stop کرنا تو اس صورت کے اندر اس پارٹ کے اندر execution آتی ہے اس پارٹ کے اندر جب execution آتی ہے یہ shut down کر دے گا اور mutex کو release کر دے گا shut down ایک کہہ لیں کہ flag ہے اس flag کو اس نے one کر دیا اور یہ endear کرتا ہے کہ بس اب consumer کی execution stop ہو جائے گی ان case c آتی ہے input user سے تو اس case میں اس نے consume کرنا ہے ان case یہ consume کرنا چاہتا ہے تو اس case میں یہ wait call کرے گا over am ready and wait call کرے گا over am guard am guard آپ کو یاد ہے آپ کو وہ mutex ہے اور اگر کوئی دوسرا اس وقت producer کوئی produce کر رہا ہے یا کوئی more thread be am guard کو use کر رہی ہے تو یہ wait کرنا شروع کر دے گا اگر نہیں ہیں تو یہ endear ہو جائے گا اور پھر جو بھی message آیا تھا اس message کو یہ get کرے گا یہاں پر am block میں سے اس message کو get کرے گا اور یہ release تب ہی ہوگا یہاں پر دیکھیں am ready کو اس نے call کیا تو یہ release تب ہی ہوگا جب event کر ہوگا جب آپ نے در set event سے set event یہ am ready ہے یہ آپ کا event اور یہ release تب ہی ہو سکتا ہے جب set event call ہوگا اگر producer پہلے execute ہوا ہوگا جس طرح ہم نے producer میں پہلے دیکھا تھا کہ producer جو produce کرتا تو produce کرنے کے بعد set event call کرتا ہے am ready کیوں پر اگر یہ set event نہیں ہوا تو یہاں پہ consumer کے اندر کیا ہوگا consumer کے اندر یہاں پہ wait کرنا شروع کر دے گا اور اگر producer نے produce کر لیے تو جب producer produce کرے گا تو in the end کیا کرا وہ set event کو call کرا set event کو call کر کے اس نے am ready کیوں پر set event call کیا تو اس set event call ہونے کی وجہ سے یہاں پہ یہ wait state کی اندر نہیں جائے گا یہ release ہو جائے گا پھر یہاں پہ اس والی mutex کیوں پر wait کرے گا اگر already producer کچھ نہیں produce کرا تو یہاں پہ یہاں پہ release ہو جائے گا اور پھر یہاں this message کو جو ہے consume کر سکتا ہے consume کرنے کا مطلب ہے جو بھی اس نے display کرنا جو بھی اس کے پر operation پر perform کرنے message کو لے گا اس کے پر operation پر perform کرے گا اور in the end am guard جو mutex ہے اس کو release کر دے گا جب تک release نہیں کرتا تو آپ کا جو producer ہے وہ بھی produce کرنے سے پہلے wait میں آ جائے گا اگر producer wait produce کرنا چاہر ہے تو یہ اس کو release کرنے کے بعد producer جو third جو وہ بھی release ہو جائے گی اور وہ بھی produce کر سکتے گی باقی اس کے لہاں یہ دوسر چھوٹے function ہیں یہ message fill اور message display message کو display کرنے کے لیے اور message کیا items کے اندر values place کرنے کے لیے تو اس کے اندر آپ سم سکتے ہیں کہ یہ جو آپ کا producer process ہے producer thread ہے اور آپ کی ایک consumer thread ہے producer thread کیا کرتی ہے producer thread wait کری ہے پہلے guard کے اوپر m guard کے اوپر ٹھیک ہے اور پھر یہ produce کرتی ہے produce کرنے کے بعد یہ set event کرتی ہے over over am ready am ready جو یہ آپ کا event اور یہاں پہ یہ release کرتی ہے اس کے بعد release کرتی ہے guard کو جو consumer ہے consumer بھی exactly یہ کرے گا wait کرے گا over am ready اس event کی مدد سے ادھر جو set event کیا گیا اور ادھر جو wait کیا گیا اس event کے اوپر اس کی مدد سے synchronization ہو رہی ہے consumer کبھی بھی consume نہیں کر سکے گا unless کے producer نے produce کیا ہو گا producer ادھر کچھ produce کرے گا تو پھر ہی consumer consume کر سکے گا اگر consumer پہلے consume کرنے کی کوشش کرے گا تو wait state کے اندر چلا جائے گا یہاں سے وہ release ہوتا تو پھر وہ wait call کرے گا guard کیوں پر wait call کرے گا guard کیوں پر wait call کرے گا guard کیوں پر sleeve wait call کرے گا تاکہ وہ دیکھنا چاہ رہا ہے کہیں اب اس وقت produce تو نہیں رہا اگر produce نہیں ہو رہا تو پھر یہاں پے اپنے body کے اندر انٹر ہو گا ادھر stop کرنا چاہے stop کر رہے گا ادھر consume کرنا چاہے consume کر لے گا اور in the end ان دونوں کو اس نے guard کو اس نے release کر دے the guard کو اس نے release کر دے نا اور کیونکہ auto event ہے تو اس event کو پھر سے آپ کو خود سے release کرنے کی ضرورت نہیں پڑتی اس کو reset کرنے کی ضرورت نہیں پڑتی کیونکہ auto ہے اگر manual ہوتا تو پھر یہاں پے ہمیں اس event کو reset بھی کرنے کی ضرورت تو اس model کے اندر آپ کو reset کرنے کی ضرورت نہیں پڑی جو ہی یہاں پے release ہوتا ہے تو release ہونے کے بعد یہاں automatically reset بھی ہو جاتا ہے تو اس لے آپ کو اپنے event کو یہاں پے release کرنے کی بالکل بھی ضرورت نہیں پڑی تو اس combination کے اندر ہم کیا ہم کیا use کرے ہیں اس combination کے اندر ہم auto event کو use کرے ہیں with set event auto event single event ہوگا and set event کے ساتھ use کرے ہیں کیونکہ auto ہے تو a کی process release ہو سکے گا اور جو ہی وہ release ہوگا تو بعد میں وہ خود سے reset بھی ہو جائے گا