C++ میں ملٹی تھریڈنگ کو کیسے نافذ کریں۔

C My Ml Y T Ry Ng Kw Kys Nafdh Kry



C++ میں ملٹی تھریڈنگ ایک ایسی خصوصیت ہے جو ایک ہی وقت میں متعدد کاموں کو انجام دینے کی اجازت دیتی ہے۔ ایک دھاگہ ایک خاص عمل کی ورکنگ یونٹ ہے جس پر عمل کیا جا رہا ہے۔ متعدد تھریڈز ملٹی تھریڈنگ کو انجام دینے کے لیے ایک ہی وقت میں ایک دوسرے سے آزادانہ طور پر کام کرتے ہیں۔

C++ میں ملٹی تھریڈنگ کو کیسے نافذ کریں۔

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







C++ میں ملٹی تھریڈنگ کے لیے پیشگی شرائط

ونڈوز پر، تھریڈز سے متعلق فنکشنز C++ 11 اور ایڈوانس ورژن میں کیے جا سکتے ہیں۔ Dev-C++ کمپائلر استعمال کرتے وقت، ڈیفالٹ کے طور پر یہ C++ 3 ورژن پر ہوتا ہے، اس لیے اسے دستی طور پر C++ 11 ورژن میں تبدیل کرنے کی ضرورت ہے۔ GNU C++11 ماحول کو زبان کی معیاری ترتیبات کو تبدیل کر کے منتخب کیا جا سکتا ہے۔



Dev-C++ کمپائلر کھولیں اور ٹاسک بار میں 'ٹولز' پر جائیں۔ 'Compiler Options' کو منتخب کریں اور پھر 'Settings' کو منتخب کریں، 'Code Generation' بلاک پر کلک کریں کمانڈز کی فہرست ظاہر ہوگی۔ 'Language Standard(-std)' سے GNU C++11 کو منتخب کریں اور پھر OK پر کلک کریں۔ اب یہ کمپائلر تھریڈ آپریشنز کو سپورٹ کرنے کے لیے بالکل تیار ہے۔




GitHub سے لائبریریاں ڈاؤن لوڈ کریں۔ اور انہیں Cpp کمپائلر کے lib فولڈر میں رکھیں۔ پروگرام میں ان لائبریریوں کو #include 'mingw.thread.h' اور ہیڈر فائلوں کا استعمال کرتے ہوئے کال کریں، ذیل میں اس کا نحو ہے:





std::thread thread_object ( کال کے قابل ) ;


std::thread کو C++11 میں #include 'mingw.thread.h' ہیڈر فائل سے تعاون حاصل ہے۔ یہ ایک تھریڈ کلاس ہے اور ایک ہی تھریڈ کی نمائندگی کرتا ہے۔ std::thread کا استعمال کرتے ہوئے ایک نیا دھاگہ بنایا جاتا ہے اور اسے کال ایبل پاس کیا جاتا ہے۔ کال ایبل ایک قابل عمل کوڈ ہے، جو تھریڈ کے چلنے پر عمل میں لایا جا رہا ہے۔ کال ایبل ذیل میں دی گئی تین اقسام میں سے کوئی بھی ہو سکتی ہے۔

جب کوئی آبجیکٹ بنتا ہے، تو یہ ایک نیا تھریڈ لانچ کرتا ہے، جو کال ایبل میں کوڈ پر عمل کرتا ہے۔



فنکشن آبجیکٹ کا استعمال کرتے ہوئے تھریڈ کا آغاز

تھریڈ کو لانچ کرنے کے لیے فنکشن آبجیکٹ کو کال ایبل کے طور پر استعمال کیا جاسکتا ہے، اوورلوڈ آپریٹر () اسے کال ایبل بناتا ہے:

کلاس فنکشن_آجیکٹ_کلاس {
باطل آپریٹر ( ) ( پیرامز )
{
بیانات
}
}
std::thread thread_object ( فنکشن_آجیکٹ_کلاس ( ) , params )


اوورلوڈ فنکشن کنسٹرکٹر کو پہلے آبجیکٹ کے طور پر اور اسٹیٹمنٹس کو دوسرے آبجیکٹ کے طور پر فراہم کیا جاتا ہے۔

فنکشن پوائنٹر کا استعمال کرتے ہوئے تھریڈ کا آغاز

ایک فنکشن پوائنٹر کی تعریف کی گئی ہے، اور پھر اسے تھریڈ لانچ کرنے کے لیے کال ایبل کے طور پر استعمال کیا جاتا ہے:

void function_call ( پرم )
{
بیانات
}
std::thread thread_obj ( function_call، params ) ;


پاس ہونے والے دلائل فنکشن کے نام کے بعد لکھے جاتے ہیں۔

لیمبڈا ایکسپریشن کا استعمال کرتے ہوئے تھریڈ کا آغاز

تھریڈ آبجیکٹ کو لیمبڈا کو بطور کال ایبل استعمال کرکے لانچ کیا جاسکتا ہے۔

// لیمبڈا اظہار کی وضاحت کریں۔
آٹو f = [ ] ( پیرامز )
{
بیانات
} ;

std::thread thread_object ( f، params ) ;


لیمبڈا ایکسپریشن کی وضاحت کی گئی ہے، اور تھریڈ کو لانچ کرنے کے لیے اس میں پیرامیٹرز کو بلایا گیا ہے۔

کچھ معاملات میں، تھریڈ کو اگلی کمانڈ پر عمل کرنے سے پہلے اسے روکنا پڑتا ہے۔ دی std::thread::join () فنکشن کا استعمال تھریڈ کے ختم ہونے کا انتظار کرنے کے لیے کیا جاتا ہے۔ مثال کے طور پر، اگر ہم تھریڈ کو GUI کا کوئی کام تفویض کرتے ہیں، تو ہمیں پہلے GUI کو صحیح طریقے سے لوڈ کرنے کے لیے اس کے مکمل ہونے کا انتظار کرنا ہوگا اور پھر اگلی کمانڈ پر عمل درآمد ہوگا۔

اہم int ( )
{

std::تھریڈ t1 ( کال کے قابل ) ;
t1. شمولیت ( ) ;
بیانات
}

مثال

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

# شامل کریں
# شامل کریں
نام کی جگہ کا استعمال کرتے ہوئے std؛


باطل foo ( int Z )
{
کے لیے ( int i = 0 ; میں < Z; i++ ) {
cout << 'فنکشن کا استعمال کرتے ہوئے تھریڈ'
'پوائنٹر بطور کال ایبل \n ' ;
}
}


کلاس تھریڈ_obj {
عوام:
باطل آپریٹر ( ) ( int x )
{
کے لیے ( int i = 0 ; میں < ایکس؛ i++ )
cout << 'فنکشن کا استعمال کرتے ہوئے تھریڈ'
'آجیکٹ بطور کال ایبل \n ' ;
}
} ;


// مرکزی کوڈ
اہم int ( )
{
cout << 'موضوعات 1 اور 2 اور 3'
'آزادانہ طور پر کام کرنا'
<< endl


تھریڈ 1 ( foo 3 ) ;


تھریڈ th2 ( thread_obj ( ) ، 3 ) ;


آٹو f = [ ] ( int x ) {
کے لیے ( int i = 0 ; میں < ایکس؛ i++ )
cout << 'لیمبڈا کا استعمال کرتے ہوئے تھریڈ'
'مطلب کے طور پر اظہار \n ' ;
} ;


تھریڈ th3 ( 3 ) ;

th1.join ( ) ;

th2.join ( ) ;

th3.join ( ) ;

واپسی 0 ;
}


اس پروگرام میں تین کال ایبل بشمول فنکشن پوائنٹر، فنکشن آبجیکٹ، اور لیمبڈا ایکسپریشن تینوں تھریڈز کو بیک وقت لانچ کرنے کے لیے استعمال کیا جاتا ہے۔ تھریڈز 1، 2، اور 3 اپنی اقدار کو ایک دوسرے سے آزاد، ایک دوسرے سے مداخلت کیے بغیر پرنٹ کرتے ہیں۔ وہ اپنی اقدار کو تین بار پرنٹ کرتے ہیں۔ join() فنکشن تھریڈ کے ختم ہونے کا انتظار کرنے کے لیے استعمال کیا جاتا ہے۔


تینوں تھریڈز کے آؤٹ پٹ آزادانہ طور پر دکھائے جاتے ہیں اور تین بار دہرائے جاتے ہیں۔ ہر تھریڈ دوسرے کے پہلے ختم ہونے کا انتظار کرتا ہے۔

نتیجہ

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