غیر مستحکم C++

Ghyr Msthkm C

'یوزر اسپیس ایپلی کیشنز کے ڈویلپرز کو ہمیشہ متعلقہ کمپائلر مینوئلز کا حوالہ دینا چاہیے تاکہ یہ جان سکیں کہ کوالیفائر کو مختلف سیاق و سباق میں کیسے ہینڈل کیا جا سکتا ہے کیونکہ غیر مستحکم مطلوبہ الفاظ کے رویے کو عام طور پر ہارڈ ویئر پر منحصر سمجھا جانا چاہیے۔ جب کسی چیز کو غیر مستحکم کے طور پر نشان زد کیا جاتا ہے، تو مرتب کرنے والے کو اکثر مطلع کیا جاتا ہے کہ اسے لوڈ آپریشنز کے لیے کبھی بھی بہتر نہیں کیا جانا چاہیے اور اسے ہمیشہ رجسٹر یا کیش کے بجائے بنیادی میموری سے بازیافت کیا جانا چاہیے۔ تاہم، جب کمپائلر میموری کی جگہ کو رجسٹر میں ڈالنے کی کوشش کرتا ہے، تو یہ خود بخود کیش ہو جاتا ہے حالانکہ کیش کے متعدد درجے ہیں جو سافٹ ویئر کے لیے بڑی حد تک دستیاب نہیں ہیں اور صرف ہارڈ ویئر میں رکھے جاتے ہیں۔ نتیجے کے طور پر، ایک جیسی میموری والے مقام کے مقابلے CPU کے قریب کیش لائنوں سے RAM تک کئی گنا زیادہ تیزی سے رسائی حاصل کی جا سکتی ہے۔

مسائل اس صورت میں پیش آسکتے ہیں اگر ہم ایک غیر مستحکم کوالیفائر کا استعمال نہیں کرتے ہیں جس میں شامل ہے، جب آپٹیمائزیشن کو فعال کیا جاتا ہے، تو کوڈ توقع کے مطابق کام نہیں کرسکتا ہے۔ جب مداخلتوں کو استعمال اور فعال کیا جاتا ہے، تو کوڈ منصوبہ بندی کے مطابق کام نہیں کر سکتا۔ ڈیٹا کو صرف غیر مستحکم اسٹوریج میں رکھا جاتا ہے جب کہ پاور آن ہے۔ جب سپلائی ہٹا دی جاتی ہے، ڈیٹا کا نقصان ہوتا ہے۔

تاہم، غیر مستحکم اسٹوریج ڈیٹا کو رکھتا ہے یہاں تک کہ اگر بجلی چلی جائے۔ عمل کی معلومات کو مختصر طور پر اتار چڑھاؤ والے اسٹوریج پر محفوظ کیا جاتا ہے کیونکہ یہ غیر مستحکم اسٹوریج سے کافی تیز ہے۔ غیر متزلزل اسٹوریج کے برعکس، غیر مستحکم اسٹوریج حساس ڈیٹا کی حفاظت کے لیے زیادہ موزوں ہے۔ اس کی وجہ یہ ہے کہ بجلی کی فراہمی بند ہونے پر ڈیٹا ناقابل رسائی ہے۔ غیر مستحکم اسٹوریج کی قیمت بہت زیادہ ہے کیونکہ کمپیوٹر سسٹم اس میں سے چند MB سے لے کر چند GB تک ہی سما سکتا ہے۔



C++ میں غیر مستحکم کوالیفائر کی خصوصیات

C++ volatile qualifier کا مطلب یہاں دکھایا جائے گا۔ جب ہم کسی متغیر کا اعلان کرتے ہیں تو کوالیفائر 'متغیر' لاگو ہوتا ہے۔ یہ مرتب کرنے والے کو یاد دہانی کے طور پر کام کرتا ہے کہ قیمت کسی بھی وقت مختلف ہونے کی ذمہ دار ہے۔ اتار چڑھاؤ کے پاس ذیل میں درج کچھ خصلتیں ہیں۔



• میموری اسائنمنٹ کو غیر مستحکم مطلوبہ الفاظ کے ساتھ تبدیل نہیں کیا جا سکتا۔



• رجسٹر کے متغیرات کو کیش نہیں کیا جا سکتا۔

• تفویض کے لحاظ سے، قدر کو تبدیل نہیں کیا جا سکتا۔

C++ میں وولیٹائل کوالیفائر کا استعمال

1. اس کے باوجود کہ آپ کا کوڈ متغیر کی قدر کو تبدیل نہیں کرتا ہے، اس کے باوجود یہ ایسا کر سکتا ہے۔ نتیجے کے طور پر، جب بھی مرتب کنندہ متغیر کی حالت کو چیک کرتا ہے، تو یہ فرض نہیں کر سکتا کہ یہ اس سے پڑھی گئی حالیہ قدر یا ذخیرہ شدہ حالیہ قدر کے برابر ہے۔ بلکہ، اسے ایک بار پھر متغیر کی قدر حاصل کرنی ہوگی۔



2. مرتب کرنے والے کو کسی قدر کو ذخیرہ کرنے کے عمل کو ختم کرنے کی ضرورت نہیں ہے کیونکہ یہ ایک 'سائیڈ ایفیکٹ' ہے جو باہر سے دیکھا جا سکتا ہے اور اس وقت ہوتا ہے جب کسی قدر کو غیر مستحکم متغیر میں محفوظ کیا جاتا ہے۔ مثال کے طور پر، اگر دو قدریں ایک قطار میں رکھی جاتی ہیں، تو مرتب کرنے والے کو دو مرتبہ قدر ڈالنی چاہیے۔

C++ میں غیر مستحکم کوالیفائر کا نحو

# اتار چڑھاؤ والا ڈیٹا_قسم متغیر_نام

غیر مستحکم مطلوبہ لفظ کو اعلان میں استعمال کیا جانا چاہیے، اور ڈیٹا کی قسم سے مراد کسی بھی ڈیٹا کی قسم ہے، بشمول ڈبل، فلوٹ، یا انٹیجر۔ آخر میں، ہم متغیر کے لیے ایک نام کا انتخاب کرتے ہیں۔ ہم دونوں طریقوں میں سے کسی ایک کا استعمال کرتے ہوئے ایک غیر مستحکم متغیر کی وضاحت کر سکتے ہیں کیونکہ دونوں اعلانات درست ہیں۔

مثال: اتار چڑھاؤ کوالیفائر ان اشیاء کی شناخت کے لیے استعمال کیا جاتا ہے جنہیں C++ میں دیگر دھاگوں یا باہر کے اعمال کے ذریعے تبدیل کیا جا سکتا ہے۔

اگر آبجیکٹ کو کسی بیرونی سگنل یا کسی ایسے طریقہ کار سے تبدیل کیا جاتا ہے جو مداخلت کے طور پر کام کرتا ہے، تو تبدیل شدہ قدر کو RAM سے بازیافت کرنے کی ضرورت ہے کیونکہ اس دوران کیش شدہ حالت مزید مناسب نہیں ہے۔ نتیجے کے طور پر، مرتب کرنے والا غیر مستحکم اشیاء تک رسائی کو مناسب طریقے سے سنبھالتا ہے۔

# شامل کریں
#include
# شامل کریں

std کا استعمال کرتے ہوئے :: cout ;
std کا استعمال کرتے ہوئے :: endl ;
std کا استعمال کرتے ہوئے :: cerr ;
std کا استعمال کرتے ہوئے :: کھانا ;

غیر مستحکم int سیکنڈ = 0 ;

باطل DelayFiveSeconds ( ) {
جبکہ ( سیکنڈ < 3 ) {
سونا ( 200000 ) ;
cerr << 'انتظار...' << endl ;
}
}

باطل انکریمنٹ سیکنڈز ( ) {
کے لیے ( int میں = 0 ; میں < 5 ; ++ میں ) {
سونا ( 1 ) ;
cerr << 'بڑھا ہوا' << endl ;
سیکنڈ = سیکنڈ + 1 ;
}
}

int مرکزی ( ) {
ساخت وقتی آغاز { } ;
ساخت وقتی اختتام { } ;
std :: دھاگہ تھریڈ 1 ;

تھریڈ 1 = std :: دھاگہ ( انکریمنٹ سیکنڈز ) ;

DelayFiveSeconds ( ) ;

تھریڈ 1۔ شامل ہونا ( ) ;
واپسی EXIT_SUCCESS ;
}


ممکنہ منظر نامے کو واضح کرنے کے لیے، ہم نے غیر مستحکم کلیدی لفظ استعمال کیا ہے جس میں متغیر کو سیکنڈز آف ڈیٹا ٹائپ 'int' قرار دیا گیا ہے اور اسے 0 کی قدر تفویض کی گئی ہے۔ اس کے بعد، ہم دو فنکشنز بناتے ہیں: ایک 'DelayFiveSeconds' کے طور پر جو عالمی اتار چڑھاؤ والے عدد متغیر کو تبدیل کرتا ہے، اور دوسرا 'IncrementSeconds' کے طور پر جو جب لوپ کے اندر وہی تشخیص کرتا ہے۔ واضح رہے کہ یہ مثال جب سیکنڈز 3 سے کم ہونے چاہیں تو سیکنڈز پر لوپ ہونے کی اجازت دیتی ہے۔

جب شرط پوری ہو جائے گی، تب ہی جب بلاک کو عمل میں لایا جائے گا۔ وائل بلاک کے اندر، ہم نے ان سلیپ طریقہ کو استعمال کیا ہے جو 'انتظار' بیان کو پرنٹ کرتا ہے۔ 'IncrementSceonds' فنکشن میں for لوپ ہوتا ہے۔ تکرار کے بعد، نیند کا طریقہ استعمال کیا جاتا ہے، جو 'انکریمنٹ' بیان کو پرنٹ کرتا ہے اور 'سیکنڈ' متغیر کو بڑھاتا ہے۔ 'انکریمنٹ سیکنڈز' فنکشن کا ابتدائی عمل مین فنکشن کے ذریعہ بنائے گئے الگ تھریڈ کے ذریعہ کیا جاتا ہے۔ 'DelayFiveSeconds' طریقہ کو پھر مین تھریڈ کے ذریعہ بلایا جاتا ہے، ایک لوپ داخل کرتے ہوئے جو ختم نہیں ہوتا اگر سیکنڈ متغیر 5 کی قدر سے اوپر نہیں جاتا ہے۔

جیسے ہی مین تھریڈ کو سیکنڈز ویری ایبل کی ویلیو میں تبدیلی کی اطلاع ملے گی، یہ طریقہ سے واپس آجائے گا کیونکہ ایک اور تھریڈ نے اسے ساتھ ساتھ بڑھانا شروع کر دیا ہے۔

تھریڈ کوڈ کو C++ میں چلانے کے لیے، ہمیں 'g++ -pthread –o filename filename.cc' کمانڈ استعمال کرنا چاہیے۔ اگر آپ کمانڈ میں '-pthread' کو تعینات نہیں کرتے ہیں، تو کمپائلر کی طرف سے ایک استثناء کا امکان موجود ہے۔ نتیجے کے طور پر، ہم نے مؤثر طریقے سے ایک مشروط انتظار کا فنکشن بنایا جو اس وقت تک انتظار کرتا ہے جب تک کہ اتار چڑھاؤ والی چیز کسی بیرونی قوت کے ذریعے تبدیل نہ ہو جائے۔ یہ ذہن میں رکھنا ضروری ہے کہ اپ ڈیٹ کوڈ بلاک کسی مختلف ترجمہ سیکشن یا بیرونی سگنل ایکشن سے آ سکتا ہے، اگرچہ یہ کوڈ اب بھی ویسا ہی کام کرے گا اگر غیر مستحکم کوالیفائر کو ہٹا دیا جائے اور ایک روایتی عالمی متغیر استعمال کیا جائے۔

نتیجہ

یہاں، ہم C++ میں وولٹائل کے ایک جائزہ کے ساتھ نحو، استعمال، اور بہتر تفہیم کے لیے موزوں مثالوں پر غور کرتے ہیں۔ چونکہ مرتب کرنے والا قدر کی پیش گوئی نہیں کر سکتا، اس لیے سی پروگرامنگ میں اتار چڑھاؤ بہت اہم ہے۔ اتار چڑھاؤ کو استعمال کرنے کا بنیادی فائدہ یہ ہے کہ جب بھی صارف اس میں ترمیم کرنے کی درخواست کرتا ہے یا اسی متغیر کو استعمال کرنے والا کوئی دوسرا تھریڈ فعال ہوتا ہے تو اس کی قدر مختلف ہو سکتی ہے۔