From 96de07bb8f1cac9dfb69f71b7f268b1044e042e4 Mon Sep 17 00:00:00 2001 From: Lou Davila <lou.davilapr@hes-so.ch> Date: Wed, 9 Apr 2025 14:35:17 +0200 Subject: [PATCH] Fixed concurrency problems on final bikes amount --- .gitignore | 1 + tp | Bin 0 -> 21368 bytes tp.c | 87 +++++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 72 insertions(+), 16 deletions(-) create mode 100644 .gitignore create mode 100755 tp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f08278d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pdf \ No newline at end of file diff --git a/tp b/tp new file mode 100755 index 0000000000000000000000000000000000000000..71dc93f44ff8a634719c3edfc55ed4c9ad7a661c GIT binary patch literal 21368 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 LCSU<5fvz6_?~7e# literal 0 HcmV?d00001 diff --git a/tp.c b/tp.c index 5c21837..9b9366a 100644 --- a/tp.c +++ b/tp.c @@ -3,6 +3,7 @@ #include <pthread.h> #include <semaphore.h> #include <unistd.h> +#include <time.h> #define CAMION_CAPACITE 4 @@ -10,6 +11,7 @@ typedef struct { sem_t velos; sem_t bornes; int velos_dispo; + int personnes_attente; pthread_mutex_t mutex; } Site; @@ -31,27 +33,39 @@ void *habitant(void *arg) { site_suivant = rand() % SITES; } while (site_suivant == site_actuel); + pthread_mutex_lock(&sites[site_actuel].mutex); + sites[site_actuel].personnes_attente++; + pthread_mutex_unlock(&sites[site_actuel].mutex); + printf("(GET) Habitant %d attend un vélo au site %d\n", id, site_actuel); sem_wait(&sites[site_actuel].velos); + pthread_mutex_lock(&sites[site_actuel].mutex); sites[site_actuel].velos_dispo--; + sites[site_actuel].personnes_attente--; pthread_mutex_unlock(&sites[site_actuel].mutex); + printf("(GET) Habitant %d prend un vélo au site %d\n", id, site_actuel); sem_post(&sites[site_actuel].bornes); - - - //usleep((rand() % 100 + 100)); + //usleep((rand() % 1000 + 1000)); + + pthread_mutex_lock(&sites[site_suivant].mutex); + sites[site_suivant].personnes_attente++; + pthread_mutex_unlock(&sites[site_suivant].mutex); - printf("(PUT) Habitant %d attend d'avoir accès à une borne du site %d\n", id, site_actuel); + printf("(PUT) Habitant %d attend d'avoir accès à une borne du site %d\n", id, site_suivant); sem_wait(&sites[site_suivant].bornes); + pthread_mutex_lock(&sites[site_suivant].mutex); sites[site_suivant].velos_dispo++; - sem_post(&sites[site_suivant].velos); + sites[site_suivant].personnes_attente--; pthread_mutex_unlock(&sites[site_suivant].mutex); + + sem_post(&sites[site_suivant].velos); printf("(PUT) Habitant %d dépose un vélo au site %d\n", id, site_suivant); + //usleep((rand() % 1000 + 1000)); site_actuel = site_suivant; - //usleep((rand() % 100 + 100)); pthread_mutex_lock(&mutex_trajets); trajets_effectues++; @@ -73,35 +87,66 @@ void *gestion_camion(void *arg) { for (int i = 0; i < SITES; i++) { pthread_mutex_lock(&sites[i].mutex); - if (sites[i].velos_dispo > BORNES - 2 && velos_camion < CAMION_CAPACITE && sites[i].velos_dispo > 1) { - while (sites[i].velos_dispo > BORNES - 2 && velos_camion < CAMION_CAPACITE && sites[i].velos_dispo > 1) { + + // Fixed truck logic - ensure atomic operations with proper locking + if (sites[i].velos_dispo > BORNES - 2 && velos_camion < CAMION_CAPACITE) { + int aRetirer = sites[i].velos_dispo - (BORNES - 2); + if (aRetirer > CAMION_CAPACITE - velos_camion) + aRetirer = CAMION_CAPACITE - velos_camion; + + // Ensure we don't remove too many bikes + if (aRetirer > sites[i].velos_dispo-1) + aRetirer = sites[i].velos_dispo-1; + + for (int j = 0; j < aRetirer; j++) { sem_wait(&sites[i].velos); - sem_post(&sites[i].bornes); sites[i].velos_dispo--; velos_camion++; + sem_post(&sites[i].bornes); } + printf("Camion prend des vélos au site %d (Vélos dans camion: %d)\n", i, velos_camion); - } else if (sites[i].velos_dispo < 2 && velos_camion > 0) { - while (sites[i].velos_dispo < 2 && velos_camion > 0) { + } + else if (sites[i].velos_dispo < 2 && velos_camion > 0) { + int bikes_to_add = 2 - sites[i].velos_dispo; + if (bikes_to_add > velos_camion) + bikes_to_add = velos_camion; + + int available_slots = BORNES - sites[i].velos_dispo; + if (bikes_to_add > available_slots) + bikes_to_add = available_slots; + + for (int j = 0; j < bikes_to_add; j++) { sem_wait(&sites[i].bornes); - sem_post(&sites[i].velos); sites[i].velos_dispo++; velos_camion--; + sem_post(&sites[i].velos); } + printf("Camion dépose des vélos au site %d (Vélos dans camion: %d)\n", i, velos_camion); } + pthread_mutex_unlock(&sites[i].mutex); - //usleep((rand() % 100 + 100)); + usleep((rand() % 100 + 100)); } + pthread_mutex_lock(&mutex_velos_depot); if (velos_camion > 2) { velos_depot += (velos_camion - 2); velos_camion = 2; printf("Camion vide les vélos au dépôt (Vélos en dépôt: %d)\n", velos_depot); + } else if (velos_camion < 2 && velos_depot > 0) { + int needed = 2 - velos_camion; + if (needed > velos_depot) + needed = velos_depot; + velos_depot -= needed; + velos_camion += needed; + printf("Camion prend des vélos du dépôt (Vélos en dépôt: %d)\n", velos_depot); } + pthread_mutex_unlock(&mutex_velos_depot); printf("Camion fait un tour, vélos restants: %d, vélos en dépôt: %d\n", velos_camion, velos_depot); - usleep((rand() % 100 + 199)); + usleep((rand() % 100 + 100)); } return NULL; } @@ -117,6 +162,7 @@ int main(int argc, char *argv[]) { TRAJETS = atoi(argv[3]); BORNES = atoi(argv[4]); + srand(time(NULL)); sites = malloc(SITES * sizeof(Site)); pthread_t habitants[HABITANTS], camion; @@ -126,6 +172,7 @@ int main(int argc, char *argv[]) { sem_init(&sites[i].bornes, 0, 2); pthread_mutex_init(&sites[i].mutex, NULL); sites[i].velos_dispo = BORNES - 2; + sites[i].personnes_attente = 0; } for (int i = 0; i < HABITANTS; i++) { @@ -145,9 +192,17 @@ int main(int argc, char *argv[]) { total_velos += sites[i].velos_dispo; printf("Site %d contains %d bykes\n", i, sites[i].velos_dispo); } - total_velos += 2; + total_velos+= 2; printf("Nombre total de vélos à la fin : %d (doit être %d)\n", total_velos, SITES * (BORNES - 2) + 2); printf("Simulation terminée.\n"); + + for (int i = 0; i < SITES; i++) { + sem_destroy(&sites[i].velos); + sem_destroy(&sites[i].bornes); + pthread_mutex_destroy(&sites[i].mutex); + } + pthread_mutex_destroy(&mutex_trajets); + pthread_mutex_destroy(&mutex_velos_depot); free(sites); return 0; -} +} \ No newline at end of file -- GitLab