2013-01-16 1 views
1

J'ai un projet dans lequel je dois utiliser des sémaphores SYS V. J'ai plusieurs processus qui partagent un sémaphores (en utilisant la même clé) et l'initialiser avec ce code:Suppression correcte du sémaphore SYS V utilisé par plusieurs processus

bool semaphore_init(semaphore_id_t* sem, int sem_value, key_t key) 
{ 
    /* Try to get a semaphore, to check if you will be an owner */ 
    *sem = semget(key, 1, IPC_CREAT | IPC_EXCL | 0666); 
    if (*sem == -1) 
    { 
     if (errno == EEXIST) 
     { 
      /* We are not owners, get semaphore without exclusive flag */ 
      *sem = semget(key, 1, IPC_CREAT | 0666); 
      if (*sem == -1) return false; 
     } 
     else return false; 
    } 
    else 
    { 
     /* We are owners, initialize semaphore */ 
     int return_value = semctl(*sem , 0, SETVAL, sem_value); 
     if (return_value == -1) return false; 
    } 

    return true; 
} 

Mon problème est: Je veux supprimer ce sémaphores lorsque tous les processus qui l'utilisent prendra fin. Utilisation:

semctl(*sem, 0, IPC_RMID) 

n'est pas une option. Il supprime instantanément le sémaphore et les autres processus ont un comportement indéfini. Je ne peux pas trouver la bonne façon de le faire avec SYS V API.

Répondre

0

Vous pouvez utiliser le comptage de références. Il suffit à chaque processus d'incrémenter le compteur ref après le sémaphore init et de le décrémenter lorsque le processus se termine. Le dernier à le décrémenter à 0 l'enlèvera également, ou le fera nettoyer par le processus principal quand il connaîtra tous les autres processus terminés.

Vous aurez probablement besoin d'un autre mécanisme de verrouillage pour synchroniser l'accès au compteur de référence, que vous créerez/supprimerez probablement dans le processus principal qui engendre et attend d'autres processus.

De même, faites attention aux références qui pendent si vos processus peuvent se terminer anormalement.

+0

Le problème est que la bibliothèque est décentralisée. Comme vous l'avez dit, je devrais utiliser un autre sémaphore pour le comptage des références. Mais qui le libérerait? –

Questions connexes