2011-09-19 47 views
8

En el man page parece que incluso si inicializar un semáforo a un valor de uno:Cómo inicializar un semáforo binario en C

sem_init(&mySem, 0, 1); 

Aún podría ser incrementado a un valor mayor que 1 con varias llamadas a

sem_post(&mySem); 

Pero en este code example el comentario parece pensar de manera diferente:

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

¿Es posible inicializar un semáforo estrictamente binario en C?

Nota: La razón para hacer esto en lugar de usar un mutex en este caso es el sem_post y sem_wait puede ser llamado por diferentes subprocesos.

Respuesta

8

Si desea un semáforo estrictamente binario en Linux, le sugiero construir uno de los mutexes y las variables de condición.

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

¡Gracias! Terminé haciendo más o menos eso. – austinmarton

+0

¿Cuál es exactamente el punto del bucle 'while' en' mysem_wait'? ¿No hará una simple declaración 'if' el trabajo ya que' pthread_cond_wait' va a requerir el mutex después de ser señalado y 'pthread_cond_signal' solo desbloquea un único hilo esperando la condición? –

+2

@BillDeRose: las variables de condición están sujetas a despertares espurios y despertadores robados. ** Debes ** usarlos en un bucle si deseas verificar una condición. –