 اسم اللہ الرحمن الرحیم، آج ہم موڈیول 135 دسکس کریں گے، موڈیول 135 ہے about interlocked functions اس سے بہلے ہم نے دسکس کیا کہ ایک volatile qualify رہا ہے جس کی مدد سے ہم یہ انشور کر سکتے ہیں کہ میمری میں رتے ہوئے ہی جب بھی ایک variable کے پر operation perform ہو تو اس کو میمری کے اندر ہی رکھا جائے اور register میں اس کی intermediate values نہ آئے اور پھر ہم نے memory barriers بھی دیکھیں جس کی بہت سے ہم یہ انشور کرتے ہیں کہ جب بھی ایک variable update ہوتا تو وہ propagate ہو صحیح تریکہ سے memory تک تاکہ وہ باکی cores کو بھی یا باکی processors کو بھی ایکسیس بھلو اسے ہم cache کوہرنسی کی جو problem ہے اس کو counter کر سکتے ہیں اور اب ہم interlocked functions کو دسکس کریں گے یہ memory barriers کا استعمال ہم کیسے کر سکتے ہیں, memory barriers کا ہم استعمال through interlocked functions کر سکتے ہیں تو اس کی تھوڑی سی آگے detail دیکھتے جب بھی آپ ایک volatile جو آپ کے variables ہیں ان variables کیوں پر کوئی operation perform کرنا جاتے ہیں simpler operations like increment یا decrement یا exchange تو آپ کیا کرتے ہیں کہ آپ interlocked functions کا استعمال کرتے ہیں interlocked functions ہوتے ہیں وہ memory barrier کا استعمال کرتے ہیں they are easy to use سیمپل تریکہ سے فاستر تریکہ سے آپ اس کو use کر سکتے ہیں لیکن کیونکہ of course memory barrier کا استعمال ہے اس کی وجہ سے جو performance ہے اس کا drop-ac ہوتا ہے performance جو ہے وہ decreed ہوتی ہے تو دو functions ہے بڑے بیسک کیسم کے ایک memory interlocked increment اور ایک interlocked decrement تو interlocked طریقے سے آپ کسی ایک volatile variable کو اگر increment کرنا چاہتے ہیں تو آپ use کریں کہ function interlocked increment اور اگر interlocked طریقے سے آپ کسی volatile variable کو decrement کرنا چاہتے ہیں تو اس کے لیے آپ کے پاس function available ہے interlocked decrement اگر یہ ایک اور important aspect اس میں سمجھنے کی ضرورت ہے memory کے لحاظ ہے optimization کرنی پڑتی ہے جو آپ کا variable ہے جس کو آپ نے increment یا decrement کرنا وہ پہلے ہی volatile ہے اور اگر وہ 32 bit کا تو اس کو 4 byte boundary کے اوپر place ہونا چاہی ہے یعنی کہ اس کا جو address ہے that should be exactly divisible by 4 یعنی کہ 4 byte boundary کے اوپر اس کو place ہونا چاہی ہے اگر 2 byte boundary ہوگی تو اس سے ہوسکتا ہے function سائی تری کیسے work نہ کریں صرف آپ کو کبھی استعمال کرنے چاہی ہیں functions جب ان کی ضرورت ہے جب ایک increment یا decrement کرنا تو آپ نے نیس کو use کرنا لیکن اگر واقعی آپ کو زوط ہے آپ سمجھتے ہیں یہ share variable ایک variable ایسا ہے جو کہ ساری threads جس کو access کرنے کی کوشش کریں گی تب آپ in functions کا استعمال کریں کیونکہ یہ performance ہر increment کے decrement ان کی مدل سے کریں گے تو یہ performance کو de-grade کرتے گا تو in functions کو دیکھتے ہیں بڑے سیمپل سے function ہے پہلہ function interlocked increment اس کو add end جو ہے وہ ایک آپ کا variable ہے جو 4 byte boundary کے اوپر پڑا ہوگا اور وہ volatile ہونا چاہیے تو اس کا reference pass کریں گے یہ کیا کرے گا اس value کے اندر ایک increment کر دے گا اور memory barriers کا استعمال کر دے گا تاکہ یہ والا جو variable ہے یہ memory تک propagate ہو اور باقی ساری cores کو accessible ہو اسی طرح سے interlocked decrement ہے یہ بھی exactly وہی کام کر رہا بس decrement کر رہا ہے یہ increment نہیں کر رہا اور آپ اس کو جو variable pass کریں گے وہ بھی of course exactly 4 byte boundary کے اوپر ہونا چاہیے جو 64 bit versions ان کے لیے جو اس کا variant available ہے that is interlocked increment 64 یا interlocked decrement 64 اور اس کے اس کے اندر جو آپ اس کے اندر variable specify کریں گے وہ variable جو ہے وہ 64 bit کا variable ہونا چاہیے اونہ 8 byte boundary جس طرح 32 bit والے کے اندر 4 byte boundary کے اوپر ہونا چاہیے تو یہ 8 byte boundary کے اوپر ہونا چاہیے یعنی کہ اس کا address جو ہے that should be exactly divisible by 8 اس کو use کرنے کا طریقہ یہاں پہ آپ دیکھ سکتے ہیں ان آپ کا کوئی volatile variable ہے آپ نے اس کو n کا reference pass کیا اور n کو آپ نے appropriate boundary کے اوپر ہی رکھا اس کو جو address ہے وہ 4 if 32 bit cooperation ہے تو 4 byte boundary کے اوپر ہونا چاہیے n کی value increment ہوگی اور n کی value جو ہے یہ function return کرتے گا increment تو ہو جائے کہ increments ہونے کے بعد اور return ہونے سے پہلے ہو سکتا ہے switching ہو جائے اور کوئی دوسری value جو ہے n کی value کو access کرتے ہیں تو ہو سکتا ہے کہ جب واپس switching return ہو تو پھر n کی کوئی اور value جو ہے آپ کو return ہو تو یہ آپ کو سمجھا نی چاہیے کہ ٹھیک ہے جب تک آپ نے during جب یہ variable increment ہو رہا اس دوران تو کسی کسم کی switching نہیں ہو سکی لیکن جب وہ increment ہو گیا اور جب اس کی value return ہو رہی ہے اس کے بیچ میں جو انسٹرکشنز ہیں ان انسٹرکشنز کے بیچ میں switching ہو سکتی ہے اگر آپ نے دو دفعہ increment کرنا تو دو دفعہ increment کرنے کے لیے اس کو دو دفعہ نہ call کریں دو دفعہ call کریں گے تو پہلی call کے بعد ہو سکتا ہے switching ہو جائے اور پھر آپ پہلے جو results ہیں وہ unexpected ہیں تو اگر آپ نے اس کو by 2 increment کرنا اور 2 increment کرنا اور آپ سمجھتے ہیں کہ باقی کی threads ہیں ان کو value ہے وہ even value ہونی چاہیے ہر دفعہ 2 increment کریں اور اس value کا even رہنا important ہے تو آپ اس کو دو دفعہ اس کے پر increment call نہ کریں اس کو a کی go کے اندر by 2 increment کریں اس کے لیے آپ جو function use کریں گے وہ inter logged exchange add inter logged exchange add اس function کی مدل سے آپ اس کے اندر ہر دفعہ 2 add کریں جب بھی function call ہوگا اس کے اندر 2 add ہوگا اگر آپ 2 specify کرتے ہیں تو 2 add ہوگا اور جو اس کی new value ہے وہ return ہو جائے گی