سیمفور سیم_نوئٹ ، سیم_ویٹ ، سیم_ پوسٹ

Semaphore Sem_init Sem_wait



بنیادی طور پر سیمفورس کے چار افعال کے استعمال کے بارے میں جاننے کے ل This ، یہ مضمون سیمفورس کا ایک آسان تعارف ہے۔
مضمون میں دو مضامین مرتب کیے گئے ہیں:
http://blog.csdn.net/qyz_og/article/details/47189219
http://blog.csdn.net/ljianhui/article/details/10813469/
آپ کا شکریہ یہاں ~

سب سے پہلے ، سیمفور کیا ہے؟

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

صرف 0 اور 1 اقدار کے حامل سیمفورسز کو بائنری سیمفورس کہا جاتا ہے اور یہاں پر روشنی ڈالی جائے گی۔ سیمفورسز کوڈ کے کسی ٹکڑے کو ایک وقت میں صرف ایک ہی دھاگے سے پھانسی دینے سے بچانے کے لئے استعمال ہوتے ہیں۔ ہم یہ ایک بائنری سیمفور کے ساتھ کرسکتے ہیں۔

دوسرا ، سیمفور انٹرفیس کی تقریب

سیمفور کے افعال سیم سیم_ سے شروع ہوتے ہیں ، اور تھریڈ میں چار بنیادی سیمفور افعال استعمال ہوتے ہیں ، جن میں سے سبھی ہیڈر فائل سیما فور۔

Sem_init فنکشن

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

int sem_init(sem_t *sem,int pshared,unsigned int value)
  • 1

یہ فنکشن سگنل آبجیکٹ کو سیم کے ذریعہ نشاندہی کرتا ہے ، اس کے شیئرنگ کے آپشنز کا تعین کرتا ہے ، اور اسے ابتدائی عددی قیمت دیتا ہے۔
شیئر سیمفور کی قسم کو کنٹرول کرتا ہے۔ اگر اس کی قیمت 0 ہے تو ، اس کا مطلب یہ ہے کہ یہ سیم پورور موجودہ عمل کا مقامی سیمفور ہے ، بصورت دیگر سیمفور کو متعدد عملوں میں بانٹ دیا جاسکتا ہے۔ سیم کی ابتدائی قیمت ہے۔ کال کامیاب ہونے پر 0 کو واپس کیا جاتا ہے ، اور اگر ناکام ہوتا ہے تو -1 واپس آجاتا ہے۔

Sem_wait فنکشن

اس فنکشن کا استعمال ایٹم کے طریقے سے سیم پور کی قیمت کو ایک کرکے کم کرنا ہے۔ جوہری آپریشن یہ ہے کہ اگر دو دھاگے ایک ساتھ ایک ہی سیمفور کو جوڑنے یا گھٹا دینے کی کوشش کرتے ہیں تو ، وہ ایک دوسرے کے ساتھ مداخلت نہیں کریں گے۔ اس کا پروٹو ٹائپ مندرجہ ذیل ہے۔

int sem_post(sem_t *sem)
  • 1

جس شے کی نشاندہی سیم سے ہوتی ہے وہ سیمفور ہے جس کی ابتدا سیم_ انیٹ کال سے ہوتی ہے۔ کال کامیاب ہونے پر 0 کو واپس کیا جاتا ہے ، اور اگر ناکام ہوتا ہے تو -1 واپس آجاتا ہے۔

Sem_post فنکشن

اس فنکشن کو ایک جوہری انداز میں سیمفور کی قدر میں 1 شامل کرنے کے لئے استعمال کیا جاتا ہے۔ اس کا پروٹو ٹائپ مندرجہ ذیل ہے۔

int sem_post(sem_t *sem)
  • 1

سیم_ویٹ کی طرح ، جس شے کی نشاندہی سیم سے ہوتی ہے وہ سیمفور ہے جس کی ابتدا سیم_ انیٹ کال سے ہوتی ہے۔ کال کامیاب ہونے پر 0 کو واپس کیا جاتا ہے ، اور اگر ناکام ہوتا ہے تو -1 واپس آجاتا ہے۔

Sem_destroy فنکشن

یہ فنکشن استعمال شدہ سیمفورس کو صاف کرنے کے لئے استعمال ہوتا ہے۔ اس کا پروٹو ٹائپ مندرجہ ذیل ہے۔

int sem_destroy(sem_t *sem)
  • 1

کامیابی پر 0 اور ناکامی پر -1 لوٹتا ہے۔

تیسرا ، سیمفور کی تقریب

کوڈ:

#include #include #include #include #include #include sem_t sem void func1(void* arg) { sem_wait(&sem) int *running=arg printf('thread running1 ') printf('%d ',*running) } void func2(void* arg) { printf('pthread2 running ') sem_post(&sem) } int main() { sem_init(&sem,0,0) pthread_t thread[2] int a=5 pthread_create(&(thread[0]),NULL,(void*)func1,(void*)&a) printf('main thread running ') sleep(10) pthread_create(&(thread[1]),NULL,(void*)func2,(void*)&a) printf('main thread running2 ') pthread_join(thread[0],NULL) pthread_join(thread[1],NULL) sem_destroy(&sem) return 0 }
  • 1
  • دو
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • گیارہ
  • 12
  • 13
  • 14
  • پندرہ
  • 16
  • 17
  • 18
  • 19
  • بیس
  • اکیس
  • 22
  • 2. 3
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 3. 4
  • 35
  • 36
  • 37
  • 38
  • 39

پہلے سیمفور بنائیں ، دوسرا پیرامیٹر 0 ہے ، جس سے یہ ظاہر ہوتا ہے کہ یہ سیمفور موجودہ عمل کا مقامی سیمفور ہے ، ابتدائی قیمت 0 ہے۔
پھر pthread_create () فنکشن کو دو تھریڈ بنانے کے ل use استعمال کریں ، دلیل میں سے گزرتے ہوئے a۔
تھریڈ 1 بننے کے بعد ، کیونکہ سیمفور ویلیو = 0 کی ابتدا کرتا ہے ، sem_wait کال کرنا اس تھریڈ کو بلاک کردے گا ، اور سیمفور ویلیو 1 سے کم ہوجائے گی (اس معاملے میں<0), this thread function will wait.
مرکزی دھاگہ کی نیند (10) کے بعد ، تھریڈ 2 کال تیار کرتا ہے اور اس پر عمل درآمد کرتا ہے ، اور سیم سیم کو ایک دوسرے سے سیمفور میں اضافہ کرنے کے لئے استعمال کیا جاتا ہے ، جس میں تھریڈ 1 عمل کرسکتا ہے۔
تخلیق کردہ دو تھریڈز کے اختتام کا انتظار کرنے کے لئے pthread_join کا ​​استعمال کریں۔

مرتب:

gcc testSem.c -o testSem -lpthread ./testSem
  • 1
  • دو
  • 3

آؤٹ پٹ:

main thread running main thread running2 pthread2 running thread running1 5

--------------------- یہ مضمون پاگل پی ایچ پی کی سی ایس ڈی این بلاگ ، مکمل متن کا پتہ سے آیا ہے ، براہ کرم کلک کریں: https://blog.csdn.net/u013457167 / آرٹیکل / تفصیلات / 78318932؟ utm_source = کاپی