C میں پوسکس سیمفورس

C My Pwsks Symfwrs



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


اس عمل کو اپ ڈیٹس کو آسانی سے انجام دینے کے لیے آپ کے لینکس پلیٹ فارم پر تقریباً 55 Kb جگہ درکار ہے۔ اگر آپ اتنی جگہ دینا چاہتے ہیں تو جاری رکھنے کے لیے 'y' کو تھپتھپائیں۔ پروسیسنگ چند منٹوں میں مکمل ہو جائے گی۔








سسٹم کے مکمل اپ گریڈ ہونے کے بعد، ہم اپنے سسٹم میں سی لینگویج کے کمپائلر کو 'install' کمانڈ میں apt-get یوٹیلیٹی کے ساتھ کنفیگر کرنے جا رہے ہیں۔ 'gcc' کو بطور کلیدی لفظ استعمال کریں، اور بس۔





sem_init()

ایک تازہ سیمفور بنایا جائے گا جب پہلے سے ہی 's' پر کوئی نامعلوم سیمفور موجود ہو؛ بصورت دیگر، پہلے سے موجود سیمفور کو ضائع کر دیا جائے گا۔ اس پورے طریقہ کار کے دوران، 's' کا مطلب ایک سیمفور مثال ہے جو تعمیر کیا گیا ہے، اور مشترکہ ایک سگنل یا قلم ہے جو اس بات کی نشاندہی کرتا ہے کہ آیا سیمفور کو فورکڈ() طریقہ کے ساتھ تقسیم کیا جا سکتا ہے یا دوسری صورت میں۔ ان پٹ ویلیو سیمفور کے سیٹ شروعاتی نقطہ کے طور پر کام کرتی ہے۔





انٹ sem_init ( nor_t * s، int مشترکہ، غیر دستخط شدہ int ویلیو ) ;

Sem_wait()

سیمفور پر سیمفور لاک ایکشن کو انجام دینے سے جس کی وضاحت 's' کے ذریعہ کی گئی ہے، sem_wait() طریقہ اس سیمفور کو رکھتا ہے۔ سیم-انتظار کا طریقہ کار سیمفور کو برقرار رکھنے یا اسے لائن میں کھڑا رہنے کے لیے استعمال کیا جائے گا۔ کچھ پہلے سے زیادہ بوجھ والے عمل اس وقت بیدار ہوتے ہیں جب کوئی دوسرا عمل sem_post() کو طلب کرتا ہے۔



int sem_wait ( nor_t * s ) ;

کوئی_پوسٹ()

جب سیم پوسٹ کو کال کی جاتی ہے، تو ویلیو بڑھ جاتی ہے، اور پھر پہلے سے بیک اپ یا منتظر آپریشنز میں سے ایک چلنا شروع ہو جاتا ہے، یعنی پہلے سے بند سیمفور کو کھول دیتا ہے۔

int sem_post ( nor_t * s ) ;

no_destroy()

ایک ابتدائی بے نام سیمفور 's' کو تباہ کر دیا جاتا ہے جو sem delete() فنکشن کو استعمال کرتا ہے۔

int sem_destroy ( nor_t * s ) ;

مثال

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


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


جیسا کہ ہم سب جانتے ہیں کہ تمام پروگرامنگ زبانیں لائبریریوں کے بغیر کام نہیں کر سکتیں کیونکہ ان لائبریریوں میں بڑی تعداد میں کلاسز، ڈھانچے، فنکشنز اور اشیاء کو مجموعی طور پر سسٹم کے کام کرنے کے لیے استعمال کیا جاتا ہے۔ اس لیے ہم اس C پروگرام کو POSIX Semaphores کے لیے کچھ بنیادی اور ضروری لائبریریوں کے استعمال کے ساتھ شروع کر رہے ہیں۔

ان لائبریریوں کو کوڈ میں استعمال کرنے کے لیے، ہمیں ہر لائبریری کے لیے کلیدی لفظ 'include' کے ساتھ '#' حرف استعمال کرنا ہوگا۔ ابھی، ہم نے کل 4 لائبریریوں کو شامل کیا ہے جو اس پروگرام میں ہونا ضروری ہیں۔ بصورت دیگر، ہمارا پروگرام صحیح طریقے سے کام نہیں کرے گا۔ پہلی 'stdio.h' ہیڈر لائبریری عام طور پر ہر C پروگرام میں ہونا ضروری ہے کیونکہ یہ ہمیں کوڈ میں ان پٹ اور آؤٹ پٹ آپریشن کرنے کی اجازت دیتی ہے۔ لہذا، ہم اسے آسانی سے ان پٹ شامل کرنے اور کوڈ سے آؤٹ پٹ حاصل کرنے کے لیے استعمال کر رہے ہیں۔ دوسری لائبریری جو ہم یہاں استعمال کر رہے ہیں وہ ہے 'pthread.h' جو تھریڈ پروگرامنگ کے استعمال کے لیے ضروری ہے، یعنی ملٹی تھریڈنگ۔

ہم اس لائبریری کو پروگرام میں تھریڈ بنانے کے لیے استعمال کریں گے۔ اس کوڈ میں اگلی اور سب سے اہم لائبریری 'semaphore.h' ہے۔ یہ دھاگوں کو آسانی سے ہم آہنگ کرنے کے لیے استعمال کیا گیا ہے۔ آخری لیکن کم از کم، لائبریری 'unistd.h' ہے، جو ہمیں صارف کی طرف سے متعین متفرق افعال اور مستقل استعمال کرنے کے قابل بناتی ہے۔ اب، ہم نے سیمفور لائبریری کے بلٹ ان آبجیکٹ 'sem_t' کا استعمال کرتے ہوئے 's' سیمفور کا اعلان کیا ہے۔ یہاں صارف کی طرف سے طے شدہ فنکشن 'T' آتا ہے جس میں واپسی کی کوئی قسم نہیں ہے۔ یہ سنکرونائزیشن کو انجام دینے کے لیے کچھ بلٹ ان سیمفور فنکشنز کا استعمال کر رہا ہے۔ sem_wait() فنکشن یہاں '&' کریکٹر کا استعمال کرتے ہوئے سیمفور 's' کو رکھنے کے لیے ہے۔

ہولڈ کے اندر، printf() سٹیٹمنٹ کو 'sleep' فنکشن کے ساتھ عمل میں لایا گیا تاکہ اس پروگرام کو 4 سیکنڈ کے لیے سلیپ کیا جا سکے۔ ایک اور printf() اسٹیٹمنٹ ایک نیا پیغام دکھاتا ہے، اور sem_post() فنکشن سیمفور 's' پر لاک کو جاری کرنے کے لیے عمل میں آتا ہے۔

# شامل کریں
#include
#include
#include
neither_t s;
باطل * ٹی ( باطل * arg ) {
sem_wait ( اور s ) ;
printf ( 'خوش آمدید! \n ' ) ;
سونا ( 4 ) ;
printf ( 'بائے! \n ' ) ;
sem_post ( اور s ) ;
}



آئیے سیمفورس کے لیے اس سی پروگرام کے مین() طریقہ پر اچھی طرح نظر ڈالتے ہیں۔ sem_init() فنکشن کو یہاں ایک نیا سیمفور 's' بنانے کے لیے استعمال کیا گیا ہے جو کہ کانٹے دار () طریقہ کے ساتھ تقسیم نہیں کیا گیا ہے، یعنی '0'، اور اس کا نقطہ آغاز 1 پر سیٹ کیا گیا ہے۔ pthread_t آبجیکٹ pthread سے سی کی لائبریری کو دو تھریڈ آبجیکٹ، o1 اور o2 کا استعمال کرتے ہوئے دو تھریڈ بنانے کے لیے استعمال کیا گیا۔ printf() اسٹیٹمنٹ یہاں یہ ظاہر کرنے کے لیے ہے کہ ہم اگلی لائن میں pthread_create() فنکشن کا استعمال کرتے ہوئے پہلا تھریڈ بنانے جا رہے ہیں۔

ہم اس فنکشن میں o1 تھریڈ آبجیکٹ کو NULL پابندیوں کے ساتھ پاس کر رہے ہیں اور اسے پیرامیٹرز میں پاس کر کے فنکشن 'T' کو کال کر رہے ہیں۔ 4 سیکنڈ کی نیند کے بعد، ایک اور تھریڈ آبجیکٹ o2 کے ساتھ بن گیا، اور pthread_join() فنکشن کو یہاں مین() فنکشن کے ساتھ تھریڈز میں شامل کرنے کے لیے استعمال کیا جاتا ہے۔ sem_destroy() فنکشن یہاں 's' سیمفور کو تباہ کرنے کے لیے ہے، اور تمام مسدود تھریڈز بھی جاری کیے جائیں گے۔

اہم int ( ) {
sem_init ( اور s 0 ، 1 ) ;
pthread_t o1, o2;
printf ( 'اب پہلے تھریڈ میں... \n ' ) ;
pthread_create ( اور o1,NULL,T,NULL ) ;
سونا ( 4 ) ;
printf ( 'اب دوسرے تھریڈ میں... \n ' ) ;
pthread_create ( اور o2,NULL,T,NULL ) ;
pthread_join ( o1، NULL ) ;
pthread_join ( o2، NULL ) ;
کوئی_تباہ نہیں ( اور s ) ;
واپسی 0 ;
}



ہم C پروگرام کو 'Gcc' کمپائلر کے ساتھ مرتب کر رہے ہیں۔ '-lrt' اور '-lpthread' کے اختیارات POSIX تھریڈ کے افعال کو انجام دینے کے لیے استعمال کیے جاتے ہیں۔ '.a/.out' استفسار چلانے پر، پہلا تھریڈ بن گیا۔ یہ پہلا پیغام پرنٹ کرنے کے بعد سو جاتا ہے۔


دوسرا تھریڈ سنکرونائز ہو گیا، اور 4 سیکنڈ کے بعد، پہلا تھریڈ ریلیز ہو گیا، اور دوسرا تھریڈ 4 سیکنڈ کے لیے بند ہو گیا۔


آخر میں دوسرا تھریڈ بھی جاری ہو گیا۔

نتیجہ

یہ سی میں پوسکس سیمفورس کے بارے میں ہے جبکہ مختلف تھریڈز کو سنکرونائز کرنے کے لیے اس کے کچھ اہم افعال کو استعمال کرتے ہیں۔ اس مضمون کو دیکھنے کے بعد، آپ POSIX کو زیادہ سے زیادہ سمجھ سکیں گے۔