Это мой проект о структуре аэропорта. Я сделал два процесса (по одному для каждого типа самолета), и каждый процесс создает несколько потоков (один поток - это один самолет).
Каждый поток запускает функцию Pilot, которая принимает на входе структуруVol (структуру данных) и делает это :
- функция отправления (подождите, пока не освободятся критические ресурсы)
- ожидание (имитация путешествия)
- функция прибытия (то же, что и функция отправления) )
- kill thread
Я не понимаю, почему скрипт работает без ошибок и почти ничего не возвращает. После многих попыток (с printf("something")
) я обнаружил, что case 0 не используется скриптом, но typeheavy и typelight return 0.
Я также обнаружил, что он работает, когда инициализируется только один поток вместо массива это.
После нескольких часов работы я не знаю awnser.
Извините за мои ошибки в английском sh.
Большое спасибо.
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
pthread_mutex_t mutexPisteCourte = PTHREAD_MUTEX_INITIALIZER; //Short airplane landing strip mutex
pthread_mutex_t mutexPisteLongue = PTHREAD_MUTEX_INITIALIZER; //Long airplane landing strip mutex
#define tempsPiste 5 // Temps passé sur une piste (décoller et attérir) //Time on landing strip
#define tempsAeroport 5 // Temps max passé dans un aéroport // Time in a airport
#define tempsFrance 10 //Temps max de trajet en France // Time to travel through France
#define tempsEurope 25 //Temps max de trajet en Europe // Time to travel through Europe
#define nbAvionsLourd 5
#define nbAvionsLeger 2
//Prototypes
void attente(); // Wait function
void depart(int, int); //departure function
void arrivee(int, int); //arrival function
void affichage(int, char*); //display function
void *Pilote(void *); //Pilot function
//Structure représentant les données de vol //Structure were data are stored (id flight, type, destination and so on)
typedef struct structureVol
{
long id;
long type;
long destination;
}structureVol;
/*----------------*/
/* -- Fonctions --*/
/*----------------*/
void depart(int i,int j) //departure function
{
printf("Depart pris en compte"); //Test
if (j==0)
{
pthread_mutex_lock(&mutexPisteCourte);
attente(tempsPiste);
pthread_mutex_unlock(&mutexPisteCourte);
}
if (j==1)
{
pthread_mutex_lock(&mutexPisteLongue);
attente(tempsPiste);
pthread_mutex_unlock(&mutexPisteLongue);
}
else
{
printf("Erreur sur l'attribution piste décollage");
}
/* TO DO
Indiquer la piste de départ
Indiquer l'itinéraire normalisé
Indiquer la route à suivre jusqu'à la sortie de l'espace controlé ou le premier
point de report
Donner l'heure de décolage et sa limite.
Départs réalisés dans l'ordre dans lequel les avions sont prêt à décoller
Dernière règle peut être déroger pour avoir un maximum de départs ainsi qu'un
retard moyen le plus faible
*/
}
void arrivee(int i,int j) //arrival function
{
printf("Arrivée prise en compte"); //test
if (j==0)
{
pthread_mutex_lock(&mutexPisteCourte);
attente(tempsPiste);
pthread_mutex_unlock(&mutexPisteCourte);
}
if (j==1)
{
pthread_mutex_lock(&mutexPisteLongue);
attente(tempsPiste);
pthread_mutex_unlock(&mutexPisteLongue);
}
else
{
printf("Erreur sur l'attribution piste arrivée");
}
/* TO DO
Indiquer l'itinéraire normalisé ou la description de la route à suivre
jusqu'au point d'approche initiale ou au repère d'attente, jusqu'à un point
significatif ou jusqu'à l'entrée du circuit d'aerodrome, indiquer l'heure
d'approche prévue en cas d'attente ou l'estimation de la durée d'attente prévue.
*/
}
void *Pilote (void *arg) //Pilot function
{
structureVol *donnees =(structureVol *) arg;
/* Depart de l'avion */
printf("Début du thread");
depart(donnees->id,donnees->type);
fprintf(stderr,"\033[91m le vol %ld de type %ld a démarer \033[0m\n",donnees->id,donnees->type);
/* Voyage de l'avion */
attente(tempsFrance); //Avion en vol vers France
attente(tempsAeroport); //Avion en stationnement dans un autre aéroport
attente(tempsFrance); //Avion sur le retour de France
/* Arrivé de l'avion */
arrivee(donnees->id,donnees->type);
fprintf(stderr,"\033[91m le vol %ld de type %ld s'est bien terminé \033[0m\n",donnees->id,donnees->type);
pthread_exit(NULL); //Fin thread
}
void attente(int i) /* Fonction permettant d'attendre un temps aléatoire entre 1 et i */ // Wait a time between i and 1 second
{
//Initialisation du générateur de nombres aléatoire utilisant le temps système comme référence
srand(time(NULL));
int temps=rand()%i+1;
printf("Attente de %d secondes \n", temps);
sleep(temps);
}
void affichage(int i, char* texte) //display function
{
#define COLONNE 10
int k, Espace;
Espace = i*COLONNE ;
for (k=0; k<Espace; k++)
{
putchar(' ');
}
printf("%s\n",texte);
fflush(stdout);
}
/*------------*/
/* -- Main -- */
/*------------*/
int main (void)
{
int i = 0;
int thr = 0;
//int nbAvionsTotal = nbAvionsLeger + nbAvionsLourd;
structureVol *donneesVol;
//char *s1, *s2;
int typeheavy;
int typelight;
pthread_t avionlourds[nbAvionsLourd];
pthread_t avionleger[nbAvionsLeger];
printf(" ----- Initialisation du programme ----- \n\n");
affichage(1," -- Piste légère -- -- Piste lourde --\n");
affichage(2,"Test 1");
affichage(4,"Test 2");
switch(typeheavy = fork())
{
case -1:
printf("Erreur dans la création processus avion lourd \n");
break;
case 0: /* Processus type l'avion lourd */
printf("test_");
printf("je suis le fils");
for (i=0; i<nbAvionsLourd; i++)
{
printf("test2_");
donneesVol-> id = i;
donneesVol->type = 1;
donneesVol->destination = 0;
/* --- Creation de un thread par avion --- */
thr=pthread_create(&avionlourds[i], NULL, Pilote, (void *) donneesVol);
/* Erreur de création thread */
if (thr)
{
printf("Erreur sur thread %d type avion lourd \n",i);
}
for (i=0; i<nbAvionsLourd; i++)
{
pthread_join(avionlourds[i],NULL);
}
}
exit(0);
default: /* Controleur (poursuit le programme) */
printf("Dans le default\n");
wait(0);
printf("wait passé\n");
}
printf("dans le main\n");
switch(typelight = fork())
{
case -1:
printf("Erreur dans la création processus avion léger \n");
break;
case 0: /* Processus fils type l'avion léger */
for (i=0; i<nbAvionsLeger; i++)
{
donneesVol->id = i;
donneesVol->type = 0;
donneesVol->destination = 0;
/* --- Creation de un thread par avion --- */
thr=pthread_create(&avionleger[i], NULL, Pilote, (void*) donneesVol);
/* Erreur de création thread */
if (thr)
{
printf("Erreur sur thread %d type avion léger \n",i);
}
for (i=0; i<nbAvionsLeger; i++)
{
pthread_join(avionleger[i],NULL);
}
exit(0);
}
default: /* Controleur (poursuit le programme) */
wait(0);
printf("wait passé\n");
}
printf("\n ----- Fin du programme ----- \n");
return 0;
}