C . में POSIX सेमाफोर

C Mem Posix Semaphora



'हालांकि प्रत्येक प्रोग्रामिंग भाषा में विशिष्ट उद्देश्यों के लिए कई पुस्तकालय होते हैं, सी की पॉज़िक्स लाइब्रेरी का अपना स्थान होता है। इसे प्रक्रियाओं के बीच एक महान सामंजस्य बनाने के लिए डिज़ाइन किया गया है और कार्यक्रमों के भीतर मल्टीथ्रेडिंग का उपयोग करने में बहुत मदद करता है, अर्थात, कई थ्रेड्स बनाना और उनके निष्पादन को सिंक्रनाइज़ करना। आज इस गाइड के भीतर, आप सी में पॉज़िक्स सेमाफोर का उपयोग करने का एक सरल उदाहरण देखेंगे। मूल सी कोड उदाहरणों के लिए, हमें सिस्टम में इसके कंपाइलर को कॉन्फ़िगर करना होगा। लेकिन, इससे पहले, हमें सिस्टम को अपडेट करने की आवश्यकता है क्योंकि कोड के सुचारू निष्पादन के लिए यह एक आवश्यक कदम है। इस प्रकार, संलग्न स्नैप में प्रदर्शित क्वेरी आपके लिनक्स ऑपरेटिंग सिस्टम को 'उपयुक्त' उपयोगिता के साथ अपडेट और अपग्रेड करने के लिए आवश्यक है।


अपडेट को सुचारू रूप से करने के लिए इस प्रक्रिया के लिए आपके Linux प्लेटफॉर्म पर लगभग 55 Kb स्थान की आवश्यकता होती है। यदि आप इतना स्थान देना चाहते हैं, तो आगे बढ़ने के लिए 'y' पर टैप करें। प्रसंस्करण कुछ मिनटों में पूरा हो जाएगा।








सिस्टम के पूरी तरह से अपग्रेड होने के बाद, हम अपने सिस्टम में 'इंस्टॉल' कमांड में उपयुक्त-गेट यूटिलिटी के साथ सी भाषा के कंपाइलर को कॉन्फ़िगर करने जा रहे हैं। कीवर्ड के रूप में 'जीसीसी' का प्रयोग करें, और यही वह है।





sem_init ()

एक नया सेमाफोर तब बनाया जाएगा जब 'एस' पर पहले से ही एक अज्ञात सेमाफोर हो; अन्यथा, पहले से मौजूद सेमाफोर को छोड़ दिया जाएगा। इस पद्धति के दौरान, 's' एक सेमाफोर उदाहरण के लिए खड़ा है जिसे बनाया गया है, और साझा किया गया एक संकेत या पताका है जो इंगित करता है कि सेमाफोर को फोर्कड() विधि या अन्यथा के साथ वितरित किया जा सकता है। इनपुट मान सेमाफोर के सेट शुरुआती बिंदु के रूप में कार्य करता है।





इंट sem_init ( नोर_टी * s, int साझा, अहस्ताक्षरित int मान ) ;

सेम_वेट ()

's' द्वारा निर्दिष्ट सेमाफोर पर एक सेमाफोर लॉक क्रिया निष्पादित करके, sem_wait () विधि उस सेमाफोर को रखती है। सेमी-वेट प्रक्रिया का उपयोग सेमाफोर को बनाए रखने या लाइन में खड़े होने के लिए किया जाएगा। जब कोई अन्य प्रक्रिया sem_post () को आमंत्रित करती है, तो पहले की कुछ अतिभारित प्रक्रियाएँ जाग जाती हैं।



int sem_wait ( नोर_टी * एस ) ;

कोई पोस्ट नहीं()

जब सेम पोस्ट को कॉल किया जाता है, तो मान बढ़ जाता है, और फिर पहले से बैकअप या प्रतीक्षित ऑपरेशन में से एक चलना शुरू हो जाता है, यानी, पहले से लॉक किए गए सेमाफोर को अनलॉक करता है।

int sem_post ( नोर_टी * एस ) ;

no_destroy ()

सेम नष्ट () फ़ंक्शन को नियोजित करके एक प्रारंभिक नामहीन सेमाफोर 'एस' नष्ट हो जाता है।

int sem_destroy ( नोर_टी * एस ) ;

उदाहरण

सेमाफोर को समझने के लिए, हम पहले एक सी फाइल बनाने जा रहे हैं और फिर उसमें एक कोड जोड़ेंगे। एक बनाने के लिए, 'टच' क्वेरी का उपयोग करें, और आप अपने सिस्टम के होम फोल्डर में नई फाइल पाएंगे।


अब, आपको अपनी खाली सी फ़ाइल को कुछ साधारण संपादक के साथ खोलना होगा ताकि उसमें अच्छा कोड उत्पन्न हो सके। हम अब तक 'नैनो' संपादक की कोशिश कर रहे हैं, जैसा कि नीचे दिए गए स्नैप में दिखाया गया है।


जैसा कि हम सभी जानते हैं कि सभी प्रोग्रामिंग भाषाएं पुस्तकालयों के बिना काम नहीं कर सकती हैं क्योंकि इन पुस्तकालयों में बड़ी संख्या में कक्षाएं, संरचनाएं, कार्य और वस्तुएँ होती हैं जिनका उपयोग समग्र प्रणाली के काम करने के लिए किया जाता है। इसलिए हम इस सी प्रोग्राम को पॉज़िक्स सेमाफोर के लिए कुछ बुनियादी और जरूरी पुस्तकालयों के उपयोग के साथ शुरू कर रहे हैं।

कोड में इन पुस्तकालयों का उपयोग करने के लिए, हमें प्रत्येक पुस्तकालय के लिए 'शामिल' कीवर्ड के साथ '#' वर्ण का उपयोग करना होगा। अभी, हमने कुल 4 पुस्तकालय जोड़े हैं जो इस कार्यक्रम में होने चाहिए। नहीं तो हमारा प्रोग्राम ठीक से काम नहीं करेगा। पहला 'stdio.h' हेडर लाइब्रेरी आमतौर पर हर सी प्रोग्राम में होना चाहिए क्योंकि यह हमें कोड में इनपुट और आउटपुट ऑपरेशन करने की अनुमति देता है। इसलिए, हम इसका उपयोग आसानी से इनपुट जोड़ने और कोड से आउटपुट प्राप्त करने के लिए कर रहे हैं। दूसरी लाइब्रेरी जिसका हम यहां उपयोग कर रहे हैं वह 'pthread.h' है जो थ्रेड प्रोग्रामिंग, यानी मल्टीथ्रेडिंग के उपयोग के लिए जरूरी है।

हम इस लाइब्रेरी का उपयोग प्रोग्राम में थ्रेड बनाने के लिए करेंगे। इस कोड में अगला और सबसे महत्वपूर्ण पुस्तकालय 'semaphore.h' है। इसका उपयोग थ्रेड्स को सुचारू रूप से सिंक्रनाइज़ करने के लिए किया गया है। अंतिम लेकिन कम से कम, पुस्तकालय 'unistd.h' है, जो हमें उपयोगकर्ता द्वारा परिभाषित विविध कार्यों और स्थिरांक का उपयोग करने में सक्षम बनाता है। अब, हमने सेमाफोर लाइब्रेरी के 'sem_t' बिल्ट-इन ऑब्जेक्ट का उपयोग करके 's' सेमाफोर घोषित किया है। यहां थ्रेड यूज़र-डिफ़ाइंड फ़ंक्शन 'टी' आता है जिसमें कोई रिटर्न प्रकार नहीं होता है। यह सिंक्रोनाइज़ेशन करने के लिए कुछ बिल्ट-इन सेमाफोर फ़ंक्शंस का उपयोग कर रहा है। sem_wait() फ़ंक्शन यहां '&' वर्ण का उपयोग करके सेमाफोर 's' को होल्ड करने के लिए है।

होल्ड के भीतर, इस प्रोग्राम को 4 सेकंड के लिए सुप्त करने के लिए 'स्लीप' फ़ंक्शन के साथ प्रिंटफ () स्टेटमेंट को निष्पादित किया गया। एक और प्रिंटफ () स्टेटमेंट एक नया संदेश प्रदर्शित करता है, और सेमाफोर 'एस' पर लॉक जारी करने के लिए सेम_पोस्ट () फ़ंक्शन निष्पादित होता है।

#शामिल करें
#शामिल करें
#शामिल करें
#शामिल
नो_टी एस;
शून्य * टी ( शून्य * आर्ग ) {
sem_wait ( और एस ) ;
printf ( 'स्वागत! \एन ' ) ;
सोना ( 4 ) ;
printf ( 'अलविदा! \एन ' ) ;
sem_post ( और एस ) ;
}



आइए सेमाफोर के लिए इस सी प्रोग्राम की मुख्य () विधि पर एक अच्छी नज़र डालें। sem_init () फ़ंक्शन का उपयोग यहां एक नया सेमाफोर 'एस' बनाने के लिए किया गया है जिसे फोर्कड() विधि, यानी '0' के साथ वितरित नहीं किया गया है, और इसका प्रारंभिक बिंदु 1 पर सेट है। pthread से pthread_t ऑब्जेक्ट C की लाइब्रेरी का उपयोग दो थ्रेड ऑब्जेक्ट्स, o1 और o2 का उपयोग करके दो थ्रेड बनाने के लिए किया गया। Printf () स्टेटमेंट यहां प्रदर्शित करने के लिए है कि हम अगली पंक्ति में pthread_create () फ़ंक्शन का उपयोग करके पहला थ्रेड बनाने जा रहे हैं।

हम इस फ़ंक्शन के लिए o1 थ्रेड ऑब्जेक्ट को NULL प्रतिबंधों के साथ पास कर रहे हैं और फ़ंक्शन 'T' को मापदंडों में पास करके कॉल कर रहे हैं। 4 सेकंड की नींद के बाद, ऑब्जेक्ट o2 के साथ एक और थ्रेड बनाया गया, और pthread_join() फ़ंक्शन का उपयोग यहां थ्रेड्स को main() फ़ंक्शन के साथ जोड़ने के लिए किया जाता है। sem_destroy () फ़ंक्शन यहां 's' सेमाफोर को नष्ट करने के लिए है, और सभी अवरुद्ध थ्रेड्स भी जारी किए जाएंगे।

मुख्य प्रवेश बिंदु ( ) {
sem_init ( और एस, 0 , 1 ) ;
pthread_t o1, o2;
printf ( 'अभी एक पहले सूत्र में... \एन ' ) ;
pthread_create ( और ओ1, नल, टी, नल ) ;
सोना ( 4 ) ;
printf ( 'अब एक दूसरे सूत्र में... \एन ' ) ;
pthread_create ( और ओ 2, नल, टी, नल ) ;
pthread_join ( ओ1, नल ) ;
pthread_join ( ओ2, नल ) ;
no_destroy ( और एस ) ;
वापसी 0 ;
}



हम सी प्रोग्राम को 'जीसीसी' कंपाइलर के साथ संकलित कर रहे हैं; POSIX थ्रेड फ़ंक्शंस को निष्पादित करने के लिए '-lrt' और '-lpthread' विकल्पों का उपयोग किया जाता है। “.a/.out” क्वेरी चलाने पर, पहला थ्रेड बन गया। पहला संदेश प्रिंट करने के बाद यह सो जाता है।


दूसरा थ्रेड सिंक्रोनाइज़ हो गया, और 4 सेकंड के बाद, पहला थ्रेड रिलीज़ हो गया, और दूसरा थ्रेड 4 सेकंड के लिए लॉक हो गया।


अंत में दूसरा धागा भी रिलीज हो गया।

निष्कर्ष

विभिन्न थ्रेड्स को सिंक्रनाइज़ करने के लिए इसके कुछ मुख्य कार्यों का उपयोग करते हुए सी में पॉज़िक्स सेमाफोर के बारे में यही है। इस लेख को पढ़ने के बाद आप POSIX को और अधिक समझ पाएंगे।