Pthreads: Conditions et Mutex
Bonjour,
J'aimerais connaître les avantages à utiliser les conditions en plus des mutex lors de l'utilisation de pthreads, les mutex permettent déjà d'assurer une certaine synchronisation entre les différents threads, pourquoi rajouter des conditions ?
une autre solution avec les sémaphores posix
une autre solution avec les sémaphores posix ;)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
sem_t pleine;
sem_t vide;
sem_t mutex;
void * production(void * arg);
void * consommation(void * arg);
int indexe=0;
char liste_produits [20]=" ";//zone de 20 produits
int main(void)
{
pthread_t prod[20];
pthread_t conso[20];
int i,tirage, nbr_prod=0, nbr_cons=0;
sem_init(&pleine, 0, 0);
sem_init(&vide, 0, 20);
sem_init(&mutex, 0, 1);
while ((nbr_prod+nbr_cons)<20){ //max 20 prod/cons
tirage=rand()%3;//nombre aleatoire entre 0 et 3
if (tirage >1) //si la valeur du tirage 2 ou 3 le main lance un cons
pthread_create(&conso[nbr_cons++], NULL, consommation, (void *)&liste_produits);
else //si la valeur du tirage 0 ou 1 le main lance un prod
pthread_create(&prod[nbr_prod++], NULL, production, (void *)&liste_produits);
}
for (i=0;i<=nbr_prod;i++) pthread_join(prod[i],NULL);
for (i=0;i<=nbr_cons;i++) pthread_join(conso[i],NULL);
return 0;
}
/*******************************************************/
void * production(void * arg)
{
sem_wait(&vide);
sem_wait(&mutex);
liste_produits[++indexe] = 'a';
printf("Production de l'element 'a', nbElement vaut %d\n", indexe);
printf ("La liste des produits est : %s\n\n",liste_produits);
sem_post(&mutex);
sem_post(&pleine);
pthread_exit(NULL);
return NULL;
}
/*********************************************************/
void * consommation(void * arg)
{
sem_wait(&pleine);
sem_wait(&mutex);
liste_produits[indexe--] = '\0';
printf("Consommation de l'element 'a', nbElement vaut %d\n", indexe);
printf ("La liste des produits est : %s\n\n",liste_produits);
sem_post(&mutex);
sem_post(&vide);
pthread_exit(NULL);
return NULL;
} |