94 lines
2 KiB
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;
|
|
}
|