2009-09-11 4 views
47

पर sem_init मैं कुछ कोड पर काम कर रहा हूं जो pthread और semaphore पुस्तकालयों का उपयोग करता है। Sem_init फ़ंक्शन मेरी उबंटू मशीन पर ठीक काम करता है, लेकिन ओएस एक्स पर sem_init फ़ंक्शन का कोई प्रभाव नहीं पड़ता है। क्या लाइब्रेरी में कुछ गड़बड़ है या क्या ऐसा करने का एक अलग तरीका है? यह वह कोड है जिसका मैं परीक्षण करने के लिए उपयोग कर रहा हूं।ओएस एक्स

sem_t sem1; 
sem_t sem2; 
sem_t sem3; 
sem_t sem4; 
sem_t sem5; 
sem_t sem6; 

sem_init(&sem1, 1, 1); 
sem_init(&sem2, 1, 2); 
sem_init(&sem3, 1, 3); 
sem_init(&sem4, 1, 4); 
sem_init(&sem5, 1, 5); 
sem_init(&sem6, 1, 6); 

मान यादृच्छिक संख्या प्रतीत होते हैं, और वे sem_init कॉल के बाद नहीं बदलते हैं।

+3

आपको 'sem_init' के वापसी मूल्य का परीक्षण करना चाहिए। – bfontaine

+0

ध्यान दें कि कम से कम मैक ओएस एक्स योसेमेट (10.10) में, 'sem_init() ',' sem_destroy() 'और' sem_getvalue() 'को' बहिष्कृत 'चिह्नित किया गया है और परिणामस्वरूप संकलक चेतावनियां उत्पन्न होती हैं। –

+0

@ जोनाथन लेफ्लर ओह, नहीं। यह मैक ओएस एक्स योसाइट (10.10.1) में काम नहीं कर सकता है। – vipygd

उत्तर

77

अनाम सेमफोर समर्थित नहीं हैं, आपको नामित सेमफोर का उपयोग करने की आवश्यकता है।

अनाम सेमाफोर के बजाय नामित सेमाफोर का उपयोग करने के लिए, sem_init के बजाय sem_open उपयोग करें, और sem_close और sem_unlink बजाय sem_destroy का उपयोग करें।

+32

वाह। '' sem_init' घोषित करता है ताकि यह ओएस एक्स पर ठीक से संकलित हो, लेकिन यह 'ईरनो' सेट 'ENOSYS' (फ़ंक्शन लागू नहीं किया गया) के साथ -1 देता है। –

+0

ठीक है, अब मैं सी ++ बूस्ट लाइब्रेरी का उपयोग करके सेमफोरों का एक अच्छा उदाहरण ढूंढ रहा हूं। मैंने सुना है कि एक मजबूत कार्यान्वयन – jcpennypincher

+0

'sem_getvalue()' काम नहीं करता है ...... देखें http://stackoverflow.com/questions/16655153/sem-getvalue-dysfunctionality-in-mac-os -xc/16655541 # 16655541 – user454322

15

ओएस एक्स पर नामांकित सेफफोर्स की तुलना में एक बेहतर समाधान (इन दिनों) ग्रैंड सेंट्रल डिस्पैच का डिस्पैच_समैमोर_टी है। यह अज्ञात POSIX semaphores की तरह बहुत काम करता है।

#include <dispatch/dispatch.h> 
dispatch_semaphore_t semaphore; 
semaphore = dispatch_semaphore_create(1); // init with value of 1 

& पोस्ट रुको (सिग्नल):

सेमाफोर प्रारंभ

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
... 
dispatch_semaphore_signal(semaphore); 

नष्ट:

dispatch_release(semaphore); 

हेडर फाइल अच्छी तरह से प्रलेखित है और मैं इसे काफी आसान पाया उपयोग करने के लिए।

+0

जीसीडी सेमफोर जीसीडी स्तर की सुविधा है। सैद्धांतिक रूप से, अगर कुछ pthread स्तर के साथ संयुक्त हो तो यह कुछ मुद्दा पैदा कर सकता है। – Eonil