Skip to content
Snippets Groups Projects
Commit e63ef07b authored by remi.greub's avatar remi.greub
Browse files

correction de citiess en cities

parent 371935d8
No related branches found
No related tags found
No related merge requests found
...@@ -27,7 +27,7 @@ struct civilian{ ...@@ -27,7 +27,7 @@ struct civilian{
int nb_trajet; int nb_trajet;
int max_trajets; int max_trajets;
int i_cities; int i_cities;
int nbcitiess; int nbcities;
int nslotss; int nslotss;
}; };
...@@ -35,7 +35,7 @@ struct Truck{ ...@@ -35,7 +35,7 @@ struct Truck{
int num_thread; int num_thread;
int n_bike; int n_bike;
int i_cities; int i_cities;
int nbcitiess; int nbcities;
int nslotss; int nslotss;
int nbCivilians; int nbCivilians;
}; };
...@@ -50,7 +50,7 @@ int rand_D(); ...@@ -50,7 +50,7 @@ int rand_D();
//void civilians_PassiveMode(void *arg); //void civilians_PassiveMode(void *arg);
void *trucks(void *arg); void *trucks(void *arg);
void *civilians(void *arg); void *civilians(void *arg);
struct cities *citiess; //this table is the size of the number of citiess, each citiess has NParkinglot and each numbers represents a free parkinglot struct cities *cities; //this table is the size of the number of cities, each cities has NParkinglot and each numbers represents a free parkinglot
int main(int argc, char **argv){ int main(int argc, char **argv){
...@@ -58,38 +58,38 @@ int main(int argc, char **argv){ ...@@ -58,38 +58,38 @@ int main(int argc, char **argv){
perror("erreur d'arguments d'entrée\n"); perror("erreur d'arguments d'entrée\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
int nbcitiess = atoi(argv[1]); //S 10 int nbcities = atoi(argv[1]); //S 10
int nbCivilians = atoi(argv[2]); //H 100 int nbCivilians = atoi(argv[2]); //H 100
int nbTrajets = atoi(argv[3]); //M 10 int nbTrajets = atoi(argv[3]); //M 10
int nbslots = atoi(argv[4]); //N 10 int nbslots = atoi(argv[4]); //N 10
nbcitiess += 1; nbcities += 1;
srand(0); srand(0);
pthread_t *threadCivilians = malloc(sizeof(pthread_t)*nbCivilians); pthread_t *threadCivilians = malloc(sizeof(pthread_t)*nbCivilians);
pthread_t *threadTruck = malloc(sizeof(pthread_t)); pthread_t *threadTruck = malloc(sizeof(pthread_t));
citiess = calloc(nbcitiess, sizeof(struct cities)); cities = calloc(nbcities, sizeof(struct cities));
struct civilian *Civilians = calloc(nbCivilians, sizeof(struct civilian)); struct civilian *Civilians = calloc(nbCivilians, sizeof(struct civilian));
struct Truck *truck = malloc(sizeof(struct Truck)); struct Truck *truck = malloc(sizeof(struct Truck));
for(int j = 0; j<nbcitiess; j++){ for(int j = 0; j<nbcities; j++){
citiess[j].nb_bikesParked = nbslots-2; cities[j].nb_bikesParked = nbslots-2;
citiess[j].nb_P_waiting = 0; cities[j].nb_P_waiting = 0;
} }
citiess[DEPOT].nb_bikesParked = 0; cities[DEPOT].nb_bikesParked = 0;
truck->i_cities = 0; truck->i_cities = 0;
truck->n_bike = TRUCK_CAPACITE_TYP; truck->n_bike = TRUCK_CAPACITE_TYP;
truck->nslotss = nbslots; truck->nslotss = nbslots;
truck->num_thread = nbCivilians; truck->num_thread = nbCivilians;
truck->nbcitiess = nbcitiess; truck->nbcities = nbcities;
truck->nbCivilians = nbCivilians; truck->nbCivilians = nbCivilians;
sem_BikeFree = malloc(sizeof(sem_t)*nbcitiess); sem_BikeFree = malloc(sizeof(sem_t)*nbcities);
sem_FreeSlot = malloc(sizeof(sem_t)*nbcitiess); sem_FreeSlot = malloc(sizeof(sem_t)*nbcities);
mutex = malloc(sizeof(pthread_mutex_t)*nbcitiess); mutex = malloc(sizeof(pthread_mutex_t)*nbcities);
for(int x =0; x<nbcitiess; x++){ for(int x =0; x<nbcities; x++){
sem_init(&sem_BikeFree[x], 0, nbslots-2);//8); sem_init(&sem_BikeFree[x], 0, nbslots-2);//8);
sem_init(&sem_FreeSlot[x], 0, nbslots-(nbslots-2));//2); sem_init(&sem_FreeSlot[x], 0, nbslots-(nbslots-2));//2);
pthread_mutex_init(&mutex[x], NULL); //mutex du truck pthread_mutex_init(&mutex[x], NULL); //mutex du truck
...@@ -104,10 +104,10 @@ int main(int argc, char **argv){ ...@@ -104,10 +104,10 @@ int main(int argc, char **argv){
for(int i=0; i<nbCivilians; i++){ for(int i=0; i<nbCivilians; i++){
Civilians[i].max_trajets = nbTrajets; Civilians[i].max_trajets = nbTrajets;
Civilians[i].nslotss = nbslots; Civilians[i].nslotss = nbslots;
Civilians[i].nbcitiess = nbcitiess; Civilians[i].nbcities = nbcities;
Civilians[i].num_thread = i; Civilians[i].num_thread = i;
Civilians[i].nb_trajet = 0; Civilians[i].nb_trajet = 0;
Civilians[i].i_cities = (rand()%(Civilians[i].nbcitiess - 1))+1; Civilians[i].i_cities = (rand()%(Civilians[i].nbcities - 1))+1;
pthread_mutex_init(&mutex[i], NULL); //mutex par civilians pthread_mutex_init(&mutex[i], NULL); //mutex par civilians
if(pthread_create(&threadCivilians[i], NULL, civilians, (void*)&Civilians[i])!=0){ if(pthread_create(&threadCivilians[i], NULL, civilians, (void*)&Civilians[i])!=0){
perror("thread creation error"); perror("thread creation error");
...@@ -129,7 +129,7 @@ int main(int argc, char **argv){ ...@@ -129,7 +129,7 @@ int main(int argc, char **argv){
} }
//free the memory //free the memory
for(int i=0; i<nbcitiess; i++){ for(int i=0; i<nbcities; i++){
sem_destroy(&sem_BikeFree[i]); sem_destroy(&sem_BikeFree[i]);
sem_destroy(&sem_FreeSlot[i]); sem_destroy(&sem_FreeSlot[i]);
} }
...@@ -144,15 +144,15 @@ int main(int argc, char **argv){ ...@@ -144,15 +144,15 @@ int main(int argc, char **argv){
free(mutex); free(mutex);
printf("***************** CYCLING TERMINATED ***************\n"); printf("***************** CYCLING TERMINATED ***************\n");
int sum=0; int sum=0;
for(int i=1; i<nbcitiess; i++){ for(int i=1; i<nbcities; i++){
printf("Terminal %d contains %d bikes\n", i, citiess[i].nb_bikesParked); printf("Terminal %d contains %d bikes\n", i, cities[i].nb_bikesParked);
sum+=citiess[i].nb_bikesParked; sum+=cities[i].nb_bikesParked;
} }
printf("total number of bikes in town: %d, in depot: %d, in truck: %d, total: %d\n", sum, citiess[DEPOT].nb_bikesParked, truck->n_bike, truck->n_bike+citiess[DEPOT].nb_bikesParked+sum); printf("total number of bikes in town: %d, in depot: %d, in truck: %d, total: %d\n", sum, cities[DEPOT].nb_bikesParked, truck->n_bike, truck->n_bike+cities[DEPOT].nb_bikesParked+sum);
free(Civilians); free(Civilians);
free(truck); free(truck);
free(citiess); free(cities);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
...@@ -166,23 +166,23 @@ void *civilians(void *arg){ ...@@ -166,23 +166,23 @@ void *civilians(void *arg){
//if(hab->i_cities==4){ //if(hab->i_cities==4){
sem_getvalue(&sem_FreeSlot[hab->i_cities],&val); sem_getvalue(&sem_FreeSlot[hab->i_cities],&val);
pthread_mutex_lock(&mutex[hab->i_cities]); pthread_mutex_lock(&mutex[hab->i_cities]);
printf("(GET) person %d starts from terminal %d (%d bykes, %d persons waiting, semslotsFree_val : %d)\n", hab->num_thread, hab->i_cities, citiess[hab->i_cities].nb_bikesParked, citiess[hab->i_cities].nb_P_waiting, val);//citiess[hab->i_cities].nb_P_waiting); printf("(GET) person %d starts from terminal %d (%d bykes, %d persons waiting, semslotsFree_val : %d)\n", hab->num_thread, hab->i_cities, cities[hab->i_cities].nb_bikesParked, cities[hab->i_cities].nb_P_waiting, val);//cities[hab->i_cities].nb_P_waiting);
pthread_mutex_unlock(&mutex[hab->i_cities]); pthread_mutex_unlock(&mutex[hab->i_cities]);
//} //}
if(citiess[hab->i_cities].nb_bikesParked<=0){// && hab->i_cities == 4){ if(cities[hab->i_cities].nb_bikesParked<=0){// && hab->i_cities == 4){
printf("person %d is STUCK at terminal %d: rack empty : %d bikes\n", hab->num_thread, hab->i_cities, citiess[hab->i_cities].nb_bikesParked); printf("person %d is STUCK at terminal %d: rack empty : %d bikes\n", hab->num_thread, hab->i_cities, cities[hab->i_cities].nb_bikesParked);
} }
pthread_mutex_lock(&mutex[hab->i_cities]); pthread_mutex_lock(&mutex[hab->i_cities]);
citiess[hab->i_cities].nb_P_waiting += 1; cities[hab->i_cities].nb_P_waiting += 1;
pthread_mutex_unlock(&mutex[hab->i_cities]); pthread_mutex_unlock(&mutex[hab->i_cities]);
sem_wait(&sem_BikeFree[hab->i_cities]); sem_wait(&sem_BikeFree[hab->i_cities]);
pthread_mutex_lock(&mutex[hab->i_cities]); pthread_mutex_lock(&mutex[hab->i_cities]);
citiess[hab->i_cities].nb_P_waiting -= 1; cities[hab->i_cities].nb_P_waiting -= 1;
citiess[hab->i_cities].nb_bikesParked -= 1; //critical section cities[hab->i_cities].nb_bikesParked -= 1; //critical section
//if(hab->i_cities==4){ //if(hab->i_cities==4){
//printf("person %d leaves terminal %d by bike\n", hab->num_thread, hab->i_cities); //printf("person %d leaves terminal %d by bike\n", hab->num_thread, hab->i_cities);
//} //}
...@@ -193,9 +193,9 @@ void *civilians(void *arg){ ...@@ -193,9 +193,9 @@ void *civilians(void *arg){
//} //}
//go to place j = rand()%ncitiess and j != i //go to place j = rand()%ncities and j != i
do{ do{
j = (rand()%(hab->nbcitiess - 1))+1; j = (rand()%(hab->nbcities - 1))+1;
}while(j==hab->i_cities); }while(j==hab->i_cities);
#if USLEEP #if USLEEP
usleep(rand_D()); usleep(rand_D());
...@@ -205,25 +205,25 @@ void *civilians(void *arg){ ...@@ -205,25 +205,25 @@ void *civilians(void *arg){
//if(j==4){ //if(j==4){
sem_getvalue(&sem_BikeFree[j],&val); sem_getvalue(&sem_BikeFree[j],&val);
pthread_mutex_lock(&mutex[j]); pthread_mutex_lock(&mutex[j]);
printf("(PUT) person %d arrives at terminal %d (%d bykes, %d persons waiting, semBikeFree_val : %d)\n", hab->num_thread, j, citiess[j].nb_bikesParked, citiess[j].nb_P_waiting, val);//citiess[j].nb_P_waiting); printf("(PUT) person %d arrives at terminal %d (%d bykes, %d persons waiting, semBikeFree_val : %d)\n", hab->num_thread, j, cities[j].nb_bikesParked, cities[j].nb_P_waiting, val);//cities[j].nb_P_waiting);
pthread_mutex_unlock(&mutex[j]); pthread_mutex_unlock(&mutex[j]);
//} //}
if(citiess[j].nb_bikesParked>=hab->nslotss){//} && j == 4){ if(cities[j].nb_bikesParked>=hab->nslotss){//} && j == 4){
printf("person %d is STUCK at terminal %d: rack full : %d bikes\n", hab->num_thread, j, citiess[j].nb_bikesParked); printf("person %d is STUCK at terminal %d: rack full : %d bikes\n", hab->num_thread, j, cities[j].nb_bikesParked);
} }
pthread_mutex_lock(&mutex[j]); pthread_mutex_lock(&mutex[j]);
citiess[j].nb_P_waiting += 1; cities[j].nb_P_waiting += 1;
pthread_mutex_unlock(&mutex[j]); pthread_mutex_unlock(&mutex[j]);
sem_wait(&sem_FreeSlot[j]); sem_wait(&sem_FreeSlot[j]);
pthread_mutex_lock(&mutex[j]); pthread_mutex_lock(&mutex[j]);
//deposit his bycycle //deposit his bycycle
citiess[j].nb_P_waiting -= 1; cities[j].nb_P_waiting -= 1;
citiess[j].nb_bikesParked += 1; //critical section cities[j].nb_bikesParked += 1; //critical section
pthread_mutex_unlock(&mutex[j]); pthread_mutex_unlock(&mutex[j]);
sem_post(&sem_BikeFree[j]); sem_post(&sem_BikeFree[j]);
//if(j==4){ //if(j==4){
...@@ -253,55 +253,55 @@ void *trucks(void *arg){ ...@@ -253,55 +253,55 @@ void *trucks(void *arg){
int tmp_nbBikes; int tmp_nbBikes;
while(personsFinished < truck->nbCivilians){ while(personsFinished < truck->nbCivilians){
//1 : for each citiess from 1 to S (0 is the depot) //1 : for each cities from 1 to S (0 is the depot)
for(int i=1; i<truck->nbcitiess; i++){ for(int i=1; i<truck->nbcities; i++){
//spreads the bikes evenly //spreads the bikes evenly
//too many bikes in this cities //too many bikes in this cities
tmp_nbBikes = truck->n_bike; tmp_nbBikes = truck->n_bike;
if(citiess[i].nb_bikesParked > (truck->nslotss-2) && truck->n_bike < TRUCK_CAPACITE_MAX){ if(cities[i].nb_bikesParked > (truck->nslotss-2) && truck->n_bike < TRUCK_CAPACITE_MAX){
while(citiess[i].nb_bikesParked > (truck->nslotss-2) && truck->n_bike < TRUCK_CAPACITE_MAX){ while(cities[i].nb_bikesParked > (truck->nslotss-2) && truck->n_bike < TRUCK_CAPACITE_MAX){
sem_wait(&sem_BikeFree[i]); sem_wait(&sem_BikeFree[i]);
pthread_mutex_lock(&mutex[i]); pthread_mutex_lock(&mutex[i]);
truck->n_bike += 1; truck->n_bike += 1;
citiess[i].nb_bikesParked -= 1; cities[i].nb_bikesParked -= 1;
pthread_mutex_unlock(&mutex[i]); pthread_mutex_unlock(&mutex[i]);
sem_post(&sem_FreeSlot[i]); sem_post(&sem_FreeSlot[i]);
} }
pthread_mutex_lock(&mutex[i]); pthread_mutex_lock(&mutex[i]);
printf("truck removes %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", truck->n_bike-tmp_nbBikes, i, citiess[i].nb_bikesParked, citiess[i].nb_P_waiting, truck->n_bike); printf("truck removes %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", truck->n_bike-tmp_nbBikes, i, cities[i].nb_bikesParked, cities[i].nb_P_waiting, truck->n_bike);
pthread_mutex_unlock(&mutex[i]); pthread_mutex_unlock(&mutex[i]);
} }
// not enough bikes in this cities // not enough bikes in this cities
// until he gets at least 2 bikes (or the truck is empty) // until he gets at least 2 bikes (or the truck is empty)
else if(citiess[i].nb_bikesParked < CITY_CAPACITY_MIN && truck->n_bike > 0){ else if(cities[i].nb_bikesParked < CITY_CAPACITY_MIN && truck->n_bike > 0){
tmp_nbBikes = truck->n_bike; tmp_nbBikes = truck->n_bike;
while(citiess[i].nb_bikesParked < CITY_CAPACITY_MIN && truck->n_bike > 0){ while(cities[i].nb_bikesParked < CITY_CAPACITY_MIN && truck->n_bike > 0){
sem_wait(&sem_FreeSlot[i]); sem_wait(&sem_FreeSlot[i]);
pthread_mutex_lock(&mutex[i]); pthread_mutex_lock(&mutex[i]);
truck->n_bike -= 1; truck->n_bike -= 1;
citiess[i].nb_bikesParked += 1; cities[i].nb_bikesParked += 1;
pthread_mutex_unlock(&mutex[i]); pthread_mutex_unlock(&mutex[i]);
sem_post(&sem_BikeFree[i]); sem_post(&sem_BikeFree[i]);
} }
pthread_mutex_lock(&mutex[i]); pthread_mutex_lock(&mutex[i]);
printf("truck adds %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", tmp_nbBikes-truck->n_bike, i, citiess[i].nb_bikesParked, citiess[i].nb_P_waiting, truck->n_bike); printf("truck adds %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", tmp_nbBikes-truck->n_bike, i, cities[i].nb_bikesParked, cities[i].nb_P_waiting, truck->n_bike);
pthread_mutex_unlock(&mutex[i]); pthread_mutex_unlock(&mutex[i]);
} }
} }
//2: goes to the depot to rebalance the truck's content to 2 bycycles //2: goes to the depot to rebalance the truck's content to 2 bycycles
tmp_nbBikes = truck->n_bike; tmp_nbBikes = truck->n_bike;
if(truck->n_bike < TRUCK_CAPACITE_TYP){ if(truck->n_bike < TRUCK_CAPACITE_TYP){
if(citiess[DEPOT].nb_bikesParked > 0){ if(cities[DEPOT].nb_bikesParked > 0){
while(truck->n_bike < TRUCK_CAPACITE_TYP && citiess[DEPOT].nb_bikesParked > 0){ while(truck->n_bike < TRUCK_CAPACITE_TYP && cities[DEPOT].nb_bikesParked > 0){
truck->n_bike += 1; truck->n_bike += 1;
pthread_mutex_lock(&mutex[DEPOT]); pthread_mutex_lock(&mutex[DEPOT]);
citiess[DEPOT].nb_bikesParked -= 1; cities[DEPOT].nb_bikesParked -= 1;
pthread_mutex_unlock(&mutex[DEPOT]); pthread_mutex_unlock(&mutex[DEPOT]);
} }
pthread_mutex_lock(&mutex[DEPOT]); pthread_mutex_lock(&mutex[DEPOT]);
printf("(DEPOT) truck gets %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", truck->n_bike-tmp_nbBikes, DEPOT, citiess[DEPOT].nb_bikesParked, citiess[DEPOT].nb_P_waiting, truck->n_bike); printf("(DEPOT) truck gets %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", truck->n_bike-tmp_nbBikes, DEPOT, cities[DEPOT].nb_bikesParked, cities[DEPOT].nb_P_waiting, truck->n_bike);
pthread_mutex_unlock(&mutex[DEPOT]); pthread_mutex_unlock(&mutex[DEPOT]);
} }
} }
...@@ -309,11 +309,11 @@ void *trucks(void *arg){ ...@@ -309,11 +309,11 @@ void *trucks(void *arg){
while(truck->n_bike > TRUCK_CAPACITE_TYP){ while(truck->n_bike > TRUCK_CAPACITE_TYP){
truck->n_bike -= 1; truck->n_bike -= 1;
pthread_mutex_lock(&mutex[DEPOT]); pthread_mutex_lock(&mutex[DEPOT]);
citiess[DEPOT].nb_bikesParked += 1; cities[DEPOT].nb_bikesParked += 1;
pthread_mutex_unlock(&mutex[DEPOT]); pthread_mutex_unlock(&mutex[DEPOT]);
} }
pthread_mutex_lock(&mutex[DEPOT]); pthread_mutex_lock(&mutex[DEPOT]);
printf("(DEPOT) truck deposit %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", tmp_nbBikes-truck->n_bike, DEPOT, citiess[DEPOT].nb_bikesParked, citiess[DEPOT].nb_P_waiting, truck->n_bike); printf("(DEPOT) truck deposit %d bikes at terminal %d (%d bikes, %d persons waiting, %d left in truck)\n", tmp_nbBikes-truck->n_bike, DEPOT, cities[DEPOT].nb_bikesParked, cities[DEPOT].nb_P_waiting, truck->n_bike);
pthread_mutex_unlock(&mutex[DEPOT]); pthread_mutex_unlock(&mutex[DEPOT]);
} }
//3: pause betweem 100us up to 199us //3: pause betweem 100us up to 199us
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment