सी

2011-09-19 9 views
8

में एक द्विआधारी सेमाफोर आरंभ कैसे man page यह प्रतीत होता है कि आप और मान एक करने के लिए एक सेमाफोर आरंभ भले ही: एकाधिक कॉल के साथसी

sem_init(&mySem, 0, 1); 

यह अभी भी एक मूल्य के वृद्धि की जा सकती है 1 से अधिक

sem_post(&mySem); 

लिए लेकिन इस code example में टिप्पणी अलग तरह से सोचने लगता है:

sem_init(&mutex, 0, 1);  /* initialize mutex to 1 - binary semaphore */ 

सी में सख्ती से बाइनरी सेमफोर शुरू करना संभव है?

नोट: इस मामले में एक mutex का उपयोग करने के बजाय ऐसा करने का कारण sem_post और sem_wait को विभिन्न धागे द्वारा बुलाया जा सकता है।

उत्तर

8

यदि आप लिनक्स पर सख्ती से बाइनरी सेमफोर चाहते हैं, तो मैं म्यूटेक्स और हालत चर के बाहर एक निर्माण का सुझाव देता हूं।

struct binary_semaphore { 
    pthread_mutex_t mutex; 
    pthread_cond_t cvar; 
    int v; 
}; 

void mysem_post(struct binary_semaphore *p) 
{ 
    pthread_mutex_lock(&p->mutex); 
    if (p->v == 1) 
     /* error */ 
    p->v += 1; 
    pthread_cond_signal(&p->cvar); 
    pthread_mutex_unlock(&p->mutex); 
} 

void mysem_wait(struct binar_semaphore *p) 
{ 
    pthread_mutex_lock(&p->mutex); 
    while (!p->v) 
     pthread_cond_wait(&p->cvar, &p->mutex); 
    p->v -= 1; 
    pthread_mutex_unlock(&p->mutex); 
} 
+0

ग्रेट धन्यवाद! मैं बहुत कुछ कर रहा था। – austinmarton

+0

'mysem_wait' में 'while' लूप का बिंदु क्या है? 'Pthread_cond_wait' सिग्नल होने के बाद म्यूटेक्स को पुनः प्राप्त करने के बाद से' ''कथन का काम आसान नहीं होगा और' pthread_cond_signal' केवल एक थ्रेड को स्थिति पर इंतजार कर रहा है? –

+2

@ बिलडेरोस: हालत परिवर्तनीय नकली वेकअप और चुराए गए जागरूकता के अधीन हैं। यदि आप किसी शर्त की जांच करना चाहते हैं तो आपको ** ** लूप में उनका उपयोग करना होगा। –