Bonjour,
Mon programme C est confronté à un problème typique de readers/writers devant accéder à la même ressource.
J'utilise donc les sémaphores et j'en crée deux dans le main :
semid = semget (IPC_PRIVATE, 2, 0666);
if (semid < 0)
{
perror("semget planté");
exit(EXIT_FAILURE);
}
up(0);
up(1);
La fonction up est
int up(int sem_nbr)
{
struct sembuf buf;
buf.sem_num = sem_nbr;
buf.sem_op = 1;
if ((semop(semid, &buf, 1)) < 0)
{
printf("semup failed on %d!!\n", sem_nbr);
fflush(NULL);
exit(EXIT_FAILURE);
}
printf("Up on sem %d\n",sem_nbr);
fflush(NULL);
return 0;
}
(à noter que down est la même chose avec -1 à la place de 1)
Et là, quand j'utilise les up et down dans mes readers, après un certain temps variables (différent à chaque exécution), les sémaphores restent à 0 et ne remontent plus à 1, bloquant le programme.
Parfois, il me dit qu'il n'a pas accès au sémaphore.
Cela se produit généralement à la deuxième ou troisième instance du reader, parfois plus tôt, parfois plus tard.
Bizarement, le fait de rajouter le fflush dans la fonction up a nettement réduit ces erreurs et certaines fois le programmes arrive jusqu'au bout de son exécution.
Qqn a une tentative d'explication à ce phénomène ?
# Ah les inits
Posté par pasBill pasGates . Évalué à 3.
1) Faudrait initialiser le semaphore avant de l'utiliser (semctl est ton ami)
2) Faudrait aussi initialiser buf.sem_flg dans up et down avant d'appeler semop
Le compilo va pas initiliaser ces valeurs pour toi et tu te retrouves avec des valeurs prises au hasard selon l'emplacement des buffers, d'ou le comportement aleatoire que tu vois.
[^] # Re: Ah les inits
Posté par ploum (site web personnel, Mastodon) . Évalué à 2.
Une erreur de copier coller qui faisait que je n'initialisais pas sem_flg dans up, mais bien dans down. C'est quand même con... (d'avoir gaché un message pour ça) mais je devais être vraiment à la masse.
Merci pour ta réponse :)
Mes livres CC By-SA : https://ploum.net/livres.html
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.