efrei/programmation-multitaches-temps-reel/redacteurs-lecteurs/synchronisation.c

94 lines
2 KiB
C

/*
* ce problème modélise les accès à une BDD
* un ensemble de processus tente constamment d'accéder à la BDD
* soit pour écrire soit pour lire
* pour assurer une certaine cohérence des données de la base, il
* faut interdire l'accès (en lecture et écriture) à tous les processus
* si un processus est en train de modifier la base (accès en écriture)
*/
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
#include <unistd.h>
#define N 3
#define ACCESS 4
int NbL = 0;
sem_t Redact;
sem_t Mutex;
void *lecteur(void*);
void *redacteur(void*);
int main () {
int i;
int numred[N] = {0, 1, 2};
int numlec[N] = {0, 1, 2};
pthread_t red[N];
pthread_t lec[N];
sem_init(&Redact, 0, 1);
sem_init(&Mutex, 0, 1);
for (i = 0; i < N; i++) {
// création des lecteurs
pthread_create(&lec[i], NULL, lecteur, &(numlec[i]));
// création des rédacteurs
pthread_create(&red[i], NULL, redacteur, &(numred[i]));
}
// attendre la fin des threads
for (i = 0; i < N; i++) {
pthread_join(red[i], NULL);
pthread_join(lec[i], NULL);
}
printf("fin des threads\n");
return 0;
}
void *lecteur(void *num) {
int i =* (int*) num;
int x = ACCESS;
do {
printf("lecteur %d\n", i);
sem_wait(&Mutex);
if (!NbL)
sem_wait(&Redact);
NbL++;
sem_post(&Mutex);
// lecture de la base
sleep(1);
// fin de l'accès à la base
sem_wait(&Mutex);
NbL--;
if (!NbL)
sem_post(&Redact);
sem_post(&Mutex);
// traitement des données lues
sleep(1);
} while (--x);
return num;
}
void *redacteur(void *num) {
int i =* (int*) num;
int x = ACCESS;
do {
printf("rédacteur %d\n", i);
sem_wait(&Redact);
// modifier les données de la base
printf("rédacteur %d: production\n", i);
sleep(1);
sem_post(&Redact);
} while (--x);
return num;
}