Je cette exigence dans laquelle je dois augmenter la valeur d'un sémaphore POSIX plus de 1. Y at-il autre façon d'y arriver? Ou devrais-je suivre la voie du système V?
Alors, quelle est vraiment votre question? Comment implémenter quelque chose qui n'est pas supporté par l'interface? Ou comment créer une structure se comportant comme semaphore en utilisant POSIX? Si cela est plus tard, avant de recourir à des pistolets lourds comme SysV, vous pouvez toujours utiliser la paire pthread_mutex_t
/pthread_cond_t
pour implémenter à peu près n'importe quelle primitive de synchronisation multi-thread, y compris le sémaphore.
Par ex, 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);
}
Il existe plusieurs problèmes avec cette implémentation. La variable 'count' ne reflète pas le nombre de processus en attente sur le sémaphore. Et les processus faisant 'decr()' avec une valeur 'delta' plus basse auront la plupart du temps la priorité sur les processus avec une valeur' delta' plus élevée, ce qui pourrait causer la famine. –