Incrémenter la valeur des sémaphores POSIX de plus de 1

J’ai cette exigence dans laquelle je dois incrémenter la valeur d’un sémaphore POSIX de plus de 1.

Apparemment, il n’y a aucun moyen dans la spécification POSIX de le faire. Il n’y a pas de sem_setvalue () semblable à sem_getvalue (). Je ne veux pas revenir aux sémaphores System V uniquement à cause de cette contrainte.

Y a-t-il un autre moyen d’accomplir cela? Ou devrais-je utiliser le système V?

Je suis en train de programmer en C sur GNU / Linux.

Grand merci d’avance.

J’ai cette exigence dans laquelle je dois incrémenter la valeur d’un sémaphore POSIX de plus de 1. Existe-t-il un autre moyen d’accomplir cela? Ou devrais-je utiliser le système V?

Alors, quelle est votre question vraiment? Comment implémenter quelque chose qui n’est pas supporté par interface? Ou comment créer une structure se comportant comme un sémaphore en utilisant POSIX?

Si c’est plus tard, avant de recourir à des armes lourdes comme SysV, vous pouvez toujours utiliser la paire pthread_mutex_t / pthread_cond_t pour mettre en œuvre à peu près n’importe quelle primitive de synchronisation multi-threads, sémaphore inclus.

Par exemple, non testé:

 typedef cool_sem { pthread_mutex_t guard; pthread_cond_t cond; int count; } cool_sem_t; void init( cool_sem_t *s ) { pthread_mutex_init( &s->guard, 0 ); pthread_cond_init( &s->cond, 0 ); s->S = 0; } void incr( cool_sem_t *s, unsigned delta ) { assert( s ); pthread_mutex_lock( &s->guard ); s->S += delta; pthread_cond_broadcast( &s->cond ); pthread_mutex_unlock( &s->guard ); } void decr( cool_sem_t *s, unsigned delta ) { assert( s ); pthread_mutex_lock( &s->guard ); do { if (s->S >= delta) { s->S -= delta; break; } pthread_cond_wait( &s->cond, &s->guard ); } while (1); pthread_mutex_unlock( &s->guard ); } 

semctl et semop sont ce dont vous avez besoin. Utilisez GETVAL SETVAL dans smectl pour les méthodes getter et setter.Set sem_op dans la structure sembuf de la manière que vous souhaitez utiliser avec le sémaphore lorsque vous utilisez semop. Voir l’homme pour plus.

Non, il n’y a pas d’alternative lorsque vous travaillez avec sem_t . Si vous ne l’avez pas encore fait, lisez la page de manuel sem_overview sur Linux. Tout ce que vous pouvez obtenir, ce sont les appels répertoriés: initialisation à une valeur spécifique, incrémentation et décrémentation de un.

S’il s’agit de la spécification complète, je pense que votre enseignant souhaite que vous développiez un mécanisme qui vous permettra d’incrémenter un sémaphore de plusieurs atomes. Donc, je suppose que l’une de vos tâches consiste à synchroniser l’incrémentation.