2009-08-18 6 views
10

स्नातक कक्षा में, हमें धागे के साथ काम पूरा करने के लिए सेमफोर का उपयोग करना पड़ा।sem_init (...): के लिए pshared पैरामीटर क्या है?

हमें sem_init का उपयोग अन्य sem_ * प्रक्रिया के समूह के साथ करने के लिए निर्देशित किया गया था, लेकिन हमें इनमें से प्रत्येक sem_ * विधियों के विवरण के बारे में अधिक जानकारी नहीं दी गई थी।

प्रोटोटाइप (और हेडर फाइल) sem_init की the following है:

#include <semaphore.h> 

int sem_init(sem_t *sem, int pshared, unsigned int value); 

लेकिन मुझे समझ नहीं आता क्या pshared मूल्य के लिए प्रयोग किया जाता है। opengroup.org के अनुसार: pshared तर्क एक गैर शून्य महत्व है

, तो सेमाफोर प्रक्रियाओं के बीच साझा किया जाता है; इस मामले में, किसी भी प्रक्रिया है कि सेमाफोर sem उपयोग कर सकते हैं sem_wait(), sem_trywait(), sem_post(), और sem_destroy() ऑपरेशनों को करने के sem उपयोग कर सकते हैं।

लेकिन मुझे लगता है कि मुझे 1,2, 10, 25, 50000, आदि के बीच का अंतर समझ में नहीं आता है। मुझे लगता है कि यह कह रहा है कि यदि मान 0 है तो सेमफोर साझा नहीं किया जाता है। (लेकिन फिर, बिंदु क्या है?)

मैं इस pshared पैरामीटर का उचित तरीके से उपयोग कैसे करूं?

उत्तर

12

sem_init की glibc संस्करण इस में क्या कहना है (अगर आप man sem_init लिनक्स पर क्या मिलेगा):

"pshared तर्क यह दर्शाता है कि इस सेमाफोर एक प्रक्रिया के धागे के बीच साझा किया जाता है, या प्रक्रियाओं के बीच। " हालांकि किसी भी गैर 0 मूल्य के रूप में सही माना जाएगा, अभ्यास सार्थक पारित कर दिया मूल्यों में करने के लिए इसे false (0) और true (1) कर रहे हैं:

तो pshared एक बूलियन मान है। यदि आप इसे 0 पास करते हैं तो आपको एक सेमफोर मिलेगा जिसे उसी प्रक्रिया में अन्य थ्रेडों द्वारा एक्सेस किया जा सकता है - अनिवार्य रूप से एक इन-प्रोसेस लॉक। आप इसे म्यूटेक्स के रूप में उपयोग कर सकते हैं, या आप सैमफोर के संसाधन-गिनती गुणों के लिए इसे अधिक आम तौर पर उपयोग कर सकते हैं। तर्कसंगत रूप से अगर pthreads ने एक सेमफोर एपीआई का समर्थन किया है तो आपको sem_init की इस सुविधा की आवश्यकता नहीं होगी, लेकिन यूनिक्स में सेमेफोर काफी समय से पर्थ्रेड से पहले हैं।

यह बेहतर होगा कि बूलियन गणन (जैसे SEM_PROCESS_PRIVATE बनाम SEM_PROCESS_SHARED) किसी तरह का था, क्योंकि तब आप इस प्रश्न नहीं पड़ता था, लेकिन POSIX संकेतबाहु एक काफी पुराने एपीआई के रूप में इन बातों को जाना जाता है।

+0

बहुत बढ़िया उत्तर, स्पष्टीकरण के लिए धन्यवाद। –

+0

आपका स्वागत है। प्रशंसा के लिए धन्यवाद :)। – quark

+0

यह संस्करण जीएलबीबीसी से संबंधित इस संस्करण को कॉल करने के लिए नहीं है। यह POSIX.1-2001 है। –

1

मैं कहूंगा कि shared पैरामीटर के संबंध में मान 1, 2, 5 और उसके बीच कोई महत्वपूर्ण अंतर नहीं है। शायद यह इस तरह लिखा गया है क्योंकि जब एपीआई पहली बार बनाई गई थी, सी में बुलियन प्रकार नहीं थे।

+0

तो क्या यह इसे पुरानी एपीआई बनाता है? – Sneakyness

+0

मुझे पता नहीं - कभी-कभी पुरानी "कोशिश की और परीक्षण" एपीआई के उपयोग में मूल्य भी होता है। आपको इसे दक्षता और स्पष्ट सुरक्षा त्रुटियों जैसी चीजों के दृष्टिकोण से देखना होगा यदि यह वास्तव में पुराना था या –

+0

स्नीकीनेस: हाँ और नहीं। उस Pthreads में, अधिक आधुनिक पसंद, एक semaphore कार्यान्वयन प्रतीत नहीं होता है, इसलिए उन मामलों के लिए जहां आप semaphores चाहते हैं कि एपीआई है कि आप उपयोग करने की आवश्यकता होगी। हां, उसमें ज्यादातर मामलों के लिए म्यूटेक्स और शर्तें सैमफोरों के स्थान पर ठीक होती हैं। – quark

1

पीएसएड तर्क यह इंगित करता है कि इस सेमफोर को प्रक्रिया के धागे, या प्रक्रियाओं के बीच साझा किया जाना है या नहीं।

यदि पीश्रेड मान 0 है, तो सेमफोर को प्रक्रिया के धागे के बीच साझा किया जाता है, और किसी भी पते पर स्थित होना चाहिए जो सभी धागे (उदाहरण के लिए, एक वैश्विक चर या गतिशील रूप से आवंटित चर ढेर)।

यदि pshared nonzero है, तो सेमफोर प्रक्रियाओं के बीच साझा किया जाता है, और साझा स्मृति के क्षेत्र में स्थित होना चाहिए (shm_open (3), mmap (2), और shmget (2) देखें)। (चूंकि कांटा (2) द्वारा बनाए गए बच्चे को अपने माता-पिता की मेमोरी मैपिंग्स मिलती हैं, इसलिए यह सेमफोर तक भी पहुंच सकती है।) साझा की गई मेमोरी क्षेत्र तक पहुंचने वाली कोई भी प्रक्रिया sem_post (3), sem_wait (3) आदि का उपयोग करके सेमफोर पर काम कर सकती है।

संबंधित मुद्दे