 بسم اللہ الرحمن الرحیم، آج ہم موڈیول 131 دسکس کریں گے، موڈیول 131 ہے need for thread synchronization ہمیں thread synchronization کی کیوں زول پڑتی ہے اور یہ thread synchronization ہمیں کب کرنی چاہیے؟ آپ کو بتایا، ابھی تک ہم یہی بات کرتا رہے ہیں کہ threads جو ہے انہیں کا کیا فضہ ہے کہ ان کی concurrent processing ہوتی ہے اگر ملٹپل پروسسز ہیں تو پارلزم بھی ہمیں دیکھنے میں ملے گی جب یہ ساری چیزیں کنکرنڈ لی ران ہو رہی ہیں تو اس کے کنکرنڈ ران ہونے کی وجہ سے ہمیں کچھ فائدہ بھی نظر آتے ہیں اور ہمیں کچھ ڈیفیکلٹیز جو ہے ان کا بھی سامنا کرنا پڑے گا اور جب اس طرح سے کنکرنڈ کئی ساری threads چالنی ہیں تو ہمیں ان threads کو اپس میں at different instances synchronize کرنے کے بھی ضرورت پڑے گی یہ کام ہم نے previously کچھ examples کے اندر کیا بھی ہے ایک ہم نے example discuss کی تھی جس میں ہم نے ایک boss worker model جو ہے وہ describe کیا تھا کہ ایک boss thread ہے اور کئی ساری آگے worker threads ہیں worker کام کریں ہیں اور information boss thread کو pass کریں ہیں boss thread وہ جو ہے ان ساروں سے دیتا لے کے ان سارے دیتا کو جو ہے وہ compile کر رہا تو اس میں کیا ہو رہا ہے اس میں جو boss ہے وہ ایک worker کا ویٹ کر رہا جب تا کہ worker اپنی execution کمپلیٹ نہیں کہا دا تھا boss اپنی execution نہیں ختم کر سکتا تو boss has to be synchronized with worker جب worker سارے کے سارے اپنی execution کمپلیٹ کرنے گے تبھی boss جو ہے وہ اپنی execution کمپلیٹ کرے گا پھر اگر for example ایک worker جو ہے اس نے اپنی execution کمپلیٹ نہیں کی اور boss جو ہے اس worker کی ڈیٹا کو access کرنے کی کوشش کرے گا تو of course اس کس کے اندر جو آپ کو پاس results آن گے وہ صحیح نہیں ہے تو آپ کو کیا کرنا ہے آپ کو یہ انشور کرنا ہے سنٹرونائز کرنا ہے worker اور boss کو کہ worker اپنی execution کمپلیٹ کرے تو پھر ای boss اس worker نے جو ڈیٹا yield کیا ہے اس ڈیٹا کو access کریں otherwise boss جو ہے وہ اس کے لیے ڈیٹ کریں پھر اسی طرح سے ایک اور چیز بھی ہم نے ایک دو examples کے اندر دیکھئے دی کہ جو worker ہے وہ اپنی working جو ہے وہ start نہیں کرتا کب تک start نہیں کرتا جب تک سارے کے سارے workers جو ہے ان کو create نہیں کر دی ہے اگر کچھ workers جو ہے ایک worker جو ہے وہ دوسرے worker کو کچھ information pass کر رہا اور ایک worker create ہو گیا ابھی دوسرہ worker create نہیں ہوا تو یہ پہلے والا worker کچھ information process کرتا ہے اور جب دوسرے worker کو pass کرتا تو worker exist نہیں کرتا تو اس لیے ضروری ہے اس طرح کی scenario کے اندر کہ سارے کے سارے workers جو ہم پہلے وہ create ہوں اور پھر ای ساری اپنی working start کریں جب تک یہ سارے create نہیں ہوتے کوئی بھی اپنی working start نہ کرے تو اس طریقے سے بھی ہمیں اس model کو synchronize کرنے کی ضرورت پڑتی ہم نے previous an example کے اندر ایسا کیا بھی تھا پھر اگر مختلف threads ہیں اور وہ کچھ share دیتا use کریں گا تو اس case کے اندر بھی ہمیں اون threads کو اپس میں کسی طریقے سے synchronize کرنے کی ضرورت ہے کہ ایک وقت میں اگر کوئی share data کو modify کرا رہا تو جب تک وہ modify کمبلیٹ نہیں کرلے تھا دوسرہ جو thread ہے وہ اس دیتا کو use نہ کرے اس کے لیوہ پرگرمز جب ایک thread کے ساتھ پرگرمن کر رہے ہیں تو ان کو یہ چیز بھی انشور کرنے کی ضرورت پڑتی ہے کہ ساری کی ساری threads جو ہم وہ same data کو a کی وقت میں modify نہ کرے اگر کوئی ایسا دیتا ہے جس نے modify ہاں ہے جس کا دا کو changes آنی ہے تو اگر multiple threads at a time modify اس SPECIFIC ڈیٹا کو modify کرنے کی کوشش کریں گے تو آپ کو پتہاں وہاں پہ بھی problems آئیں گے race condition exist آ کر ہوگی تو وہاں پہ بھی یہ ضروری ہے کہ threads اس تری کیسے synchronize ڈوں کے ایک وقت میں ایک وقت میں ایک ہی thread جو ہے اس ڈیٹا کو modify کرے اور جب وہ modify کر لیتے پھر next thread اس کو modify کرنے کی کوشش کرے سارے at a time ڈیٹا کو modify کرنے کی بالکل کوشش نہ کریں اسی طرح سے اگر کیساری threads ہیں اور وہ کچھ information process کرتی اور a queue کے اندر place کرتی جا رہی ہیں اور کچھ اور threads ہیں جو اس queue میں سے information کو جو ہے وہ remove کر رہی ہیں تو جب آپ queue میں سے ڈیٹا کو remove کر رہے تو وہاں پہ آپ کو یہ دہنے کی ضرورت ہے کہ at a time multiple threads same ڈیٹا کو remove کرنے کی بھی کوشش نہ کرنے ایک وقت میں a کی thread a single item of ڈیٹا کو وہاں سے remove کر سکتی ہے تو وہاں پہ بھی again آپ کو synchronization کی ضرورت پڑے گی تو ان سارے auspects جب بھی آپ threading کے لیے program بنائے تو ان سارے auspects کی according لی آپ کو اپنے program کو analyze کرنے کی ضرورت ہے اگر نہیں کرتے ہو سکتا ہے آپ کے program میں flaws رہا جائے اور جب execution ہوئا سچ کبھی تو ہو سکتا ہے کہ پاس results ہی آدے لیکن کبھی یہ بھی ہو سکتے ہوگا possibility ہے کہ results ہی نہ آئے اگر ان ساری چیزوں کو آپ نے تب نہیں دیکھا یہاں پہ ہم ایک example کی مدد سے اس کو سمجھنے کی کوشش کرتا ہے یہاں میں ہمارے پاس دو threads ہیں ایک ہمارے پاس thread one ہے اور ایک ہمارے پاس thread two ہے دونو threads ایکی کام کریں m is equals to n دوسرا m is equals to m plus one اور n is equals to m اب first کریں آپ چاہتے ہیں کہ یہ thread one ہے یہ بھی یہاں کام کری ہے اور اس کے بعد جو thread two ہے وہ بھی exactly یہاں کام کرے گی m is equals to n m is equals to m plus one اور n is equals to m اب initially اگر n کی value 4 ہے n کی value اگر 4 ہے آپ کہتے ہیں n is equals to m m کی آپ کے پاس value 4 آجاتی ہے m is equals to m plus one تو آپ کے پاس m کی value 5 آجاتی ہے پھر آپ کہتے ہیں n is equals to m آپ کے پاس n کی value 5 آجاتی ہے جب اگلی thread میں جائیں گے تو کیا ہوگا اگلی thread میں n کی value 5 ہے 5 چلا جائے گا m کی value کیا آجائے گی آپ کے پاس 5 آجائے گی پھر اس کو ایک increment کرتے ہیں m کی value 6 ہو گئی اور پھر یہ 6 value جو ہے n کو سائن ہو جاتی ہے n کی value بھی 6 ہو جانے چاہیے یعنی کہ اگر normal execution ہو تو اس طریق سے ہو کام چلے گا لیکن ہم نے دیکھا ہے کہ جب concurrently execute کرتے ہیں تو یہ بالکل ایک synchronous process ہے بالکل unpredictable ہے کب switching ہو جائے کب execution ایک thread سے کسی دوسی thread پہ چلے جائے کبھی بھی آپ کو preemption کے لئے تیار ہونا چاہیے اب اس example کے اندر دیکھتے ہیں thread one کی execution ہوئی thread one کی execution ہوئی تو آپ کے پاس n کی value 4 تھی m کی value بھی 4 ہو گئی n کی value 4 تھی m کی value بھی 4 ہو گئی m کو ایک increment کیا m کی value 5 ہو گئی اور اس point پر switching ہو گئی ابھی third statement execute کرنے کا اس کو چانہ سے نہیں ملا اس وقت m کی value 5 ہے لیکن n کی value ابھی بھی 4 ہے n کی value 5 نہیں ہوئی آپ کو چانہ سے نہیں ملا کہ آپ n is equals to m کو execute کریں اس کے execute ہونے سے پہلے ہی switching ہو جاتی ہے اور execution thread 2 پہ چلی جاتی ہے thread 2 پہ چاہیے گئی تو ادھر کیا ہو گا m is equals to n ہو گئی m کی value اس کو کیا ملے گئی n کی value ادھر 4 ہو گئی جبکہ ادھر m کی value کیا ہو گئی m کی value یہاں پہ 5 ہو گئی اور یہاں پہ لیکن m کی value کیا ہو گئی 4 ہو گئی کیوں 4 ہو گئی کیوں کہ ادھر n کی value اس کو 4 ملے گئی کیوں کہ یہاں پہ لیکن یہاں پہ لیکن n کی value اس کو 4 ملے گئی m کی value 4 ہو گئی m ایک انکریمنٹ ہو گئی 5 ہو گئی اور n جو ہے وہ بھی 5 ہو گئی اور اس کے بعد یہاں پہ سوچنگ ہوتی ہے سوچنگ ہونے کے بعد دیدھر بھی n جو ہے وہ 5 ہو گئی تو آن کے باس اندھر end یہ result نہیں آ رہا جو ہم نے serial execution میں دیکھا تھا serial execution گندہ جو result آ رہا ہے وہ different ہے اور concurrent execution گندہ جو result آ رہا ہے وہ different ہے اس طرح کی discrepancy ایک آگی ہے یہ discrepancy شوکہ رہی ہے کہ اس concurrent processing گندہ کوئی نا کوئی ایسی problem ہے جس problem کی وجہ سے ہمارے پاس جو result ہے وہ تیک نہیں آیا اور problem یہ ہے کہ جب آپ data کو modify کرنے کی کوشش کرتے ہیں اگر number of threads at a time same data کو modify کرنے کی کوشش کریں جب ادھر آپ n کو modify کرنے کی کوشش کر رہا تھے تو اسی دوران اس نے بھی اس کے پر switching ہوئی اور اس نے بھی n کو modify کرنا شروع کرتی ہے تو in the end جو آپ کے پاس result آئے گا وہ صحیح نہیں آئے گا یہاں پہ ہمیں چیزوں کو synchronize کرنے کی ضوط ہے اس طریقے سے کہ اگر multiple threads at a time data کو modify کرنے ہیں تو پہلے صرف ایک thread کو allow کیا جا ہے کہ وہ data کو modify کریں باقی threads wait کریں جو وہ modify کرنے پھر دوسی thread کو term دیجا ہے تو n threads کو اس طریقے سے ہم synchronize کریں