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{
int nb_trajet;
int max_trajets;
int i_cities;
int nbcitiess;
int nbcities;
int nslotss;
};
......@@ -35,7 +35,7 @@ struct Truck{
int num_thread;
int n_bike;
int i_cities;
int nbcitiess;
int nbcities;
int nslotss;
int nbCivilians;
};
......@@ -50,7 +50,7 @@ int rand_D();
//void civilians_PassiveMode(void *arg);
void *trucks(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){
......@@ -58,38 +58,38 @@ int main(int argc, char **argv){
perror("erreur d'arguments d'entrée\n");
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 nbTrajets = atoi(argv[3]); //M 10
int nbslots = atoi(argv[4]); //N 10
nbcitiess += 1;
nbcities += 1;
srand(0);
pthread_t *threadCivilians = malloc(sizeof(pthread_t)*nbCivilians);
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 Truck *truck = malloc(sizeof(struct Truck));
for(int j = 0; j<nbcitiess; j++){
citiess[j].nb_bikesParked = nbslots-2;
citiess[j].nb_P_waiting = 0;
for(int j = 0; j<nbcities; j++){
cities[j].nb_bikesParked = nbslots-2;
cities[j].nb_P_waiting = 0;
}
citiess[DEPOT].nb_bikesParked = 0;
cities[DEPOT].nb_bikesParked = 0;
truck->i_cities = 0;
truck->n_bike = TRUCK_CAPACITE_TYP;
truck->nslotss = nbslots;
truck->num_thread = nbCivilians;
truck->nbcitiess = nbcitiess;
truck->nbcities = nbcities;
truck->nbCivilians = nbCivilians;
sem_BikeFree = malloc(sizeof(sem_t)*nbcitiess);
sem_FreeSlot = malloc(sizeof(sem_t)*nbcitiess);
mutex = malloc(sizeof(pthread_mutex_t)*nbcitiess);
sem_BikeFree = malloc(sizeof(sem_t)*nbcities);
sem_FreeSlot = malloc(sizeof(sem_t)*nbcities);
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_FreeSlot[x], 0, nbslots-(nbslots-2));//2);
pthread_mutex_init(&mutex[x], NULL); //mutex du truck
......@@ -104,10 +104,10 @@ int main(int argc, char **argv){
for(int i=0; i<nbCivilians; i++){
Civilians[i].max_trajets = nbTrajets;
Civilians[i].nslotss = nbslots;
Civilians[i].nbcitiess = nbcitiess;
Civilians[i].nbcities = nbcities;
Civilians[i].num_thread = i;
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
if(pthread_create(&threadCivilians[i], NULL, civilians, (void*)&Civilians[i])!=0){
perror("thread creation error");
......@@ -129,7 +129,7 @@ int main(int argc, char **argv){
}
//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_FreeSlot[i]);
}
......@@ -144,15 +144,15 @@ int main(int argc, char **argv){
free(mutex);
printf("***************** CYCLING TERMINATED ***************\n");
int sum=0;
for(int i=1; i<nbcitiess; i++){
printf("Terminal %d contains %d bikes\n", i, citiess[i].nb_bikesParked);
sum+=citiess[i].nb_bikesParked;
for(int i=1; i<nbcities; i++){
printf("Terminal %d contains %d bikes\n", i, cities[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(truck);
free(citiess);
free(cities);
return EXIT_SUCCESS;
}
......@@ -166,23 +166,23 @@ void *civilians(void *arg){
//if(hab->i_cities==4){
sem_getvalue(&sem_FreeSlot[hab->i_cities],&val);
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]);
//}
if(citiess[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);
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, cities[hab->i_cities].nb_bikesParked);
}
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]);
sem_wait(&sem_BikeFree[hab->i_cities]);
pthread_mutex_lock(&mutex[hab->i_cities]);
citiess[hab->i_cities].nb_P_waiting -= 1;
citiess[hab->i_cities].nb_bikesParked -= 1; //critical section
cities[hab->i_cities].nb_P_waiting -= 1;
cities[hab->i_cities].nb_bikesParked -= 1; //critical section
//if(hab->i_cities==4){
//printf("person %d leaves terminal %d by bike\n", hab->num_thread, hab->i_cities);
//}
......@@ -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{
j = (rand()%(hab->nbcitiess - 1))+1;
j = (rand()%(hab->nbcities - 1))+1;
}while(j==hab->i_cities);
#if USLEEP
usleep(rand_D());
......@@ -205,25 +205,25 @@ void *civilians(void *arg){
//if(j==4){
sem_getvalue(&sem_BikeFree[j],&val);
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]);
//}
if(citiess[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);
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, cities[j].nb_bikesParked);
}
pthread_mutex_lock(&mutex[j]);
citiess[j].nb_P_waiting += 1;
cities[j].nb_P_waiting += 1;
pthread_mutex_unlock(&mutex[j]);
sem_wait(&sem_FreeSlot[j]);
pthread_mutex_lock(&mutex[j]);
//deposit his bycycle
citiess[j].nb_P_waiting -= 1;
citiess[j].nb_bikesParked += 1; //critical section
cities[j].nb_P_waiting -= 1;
cities[j].nb_bikesParked += 1; //critical section
pthread_mutex_unlock(&mutex[j]);
sem_post(&sem_BikeFree[j]);
//if(j==4){
......@@ -253,55 +253,55 @@ void *trucks(void *arg){
int tmp_nbBikes;
while(personsFinished < truck->nbCivilians){
//1 : for each citiess from 1 to S (0 is the depot)
for(int i=1; i<truck->nbcitiess; i++){
//1 : for each cities from 1 to S (0 is the depot)
for(int i=1; i<truck->nbcities; i++){
//spreads the bikes evenly
//too many bikes in this cities
tmp_nbBikes = truck->n_bike;
if(citiess[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){
if(cities[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]);
pthread_mutex_lock(&mutex[i]);
truck->n_bike += 1;
citiess[i].nb_bikesParked -= 1;
cities[i].nb_bikesParked -= 1;
pthread_mutex_unlock(&mutex[i]);
sem_post(&sem_FreeSlot[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]);
}
// not enough bikes in this cities
// 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;
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]);
pthread_mutex_lock(&mutex[i]);
truck->n_bike -= 1;
citiess[i].nb_bikesParked += 1;
cities[i].nb_bikesParked += 1;
pthread_mutex_unlock(&mutex[i]);
sem_post(&sem_BikeFree[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]);
}
}
//2: goes to the depot to rebalance the truck's content to 2 bycycles
tmp_nbBikes = truck->n_bike;
if(truck->n_bike < TRUCK_CAPACITE_TYP){
if(citiess[DEPOT].nb_bikesParked > 0){
while(truck->n_bike < TRUCK_CAPACITE_TYP && citiess[DEPOT].nb_bikesParked > 0){
if(cities[DEPOT].nb_bikesParked > 0){
while(truck->n_bike < TRUCK_CAPACITE_TYP && cities[DEPOT].nb_bikesParked > 0){
truck->n_bike += 1;
pthread_mutex_lock(&mutex[DEPOT]);
citiess[DEPOT].nb_bikesParked -= 1;
cities[DEPOT].nb_bikesParked -= 1;
pthread_mutex_unlock(&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]);
}
}
......@@ -309,11 +309,11 @@ void *trucks(void *arg){
while(truck->n_bike > TRUCK_CAPACITE_TYP){
truck->n_bike -= 1;
pthread_mutex_lock(&mutex[DEPOT]);
citiess[DEPOT].nb_bikesParked += 1;
cities[DEPOT].nb_bikesParked += 1;
pthread_mutex_unlock(&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]);
}
//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