簡體   English   中英

我如何在 C 中使用進程中的線程數組

[英]How can i use an array of threads from process in C

這是我關於機場結構的項目。 我制作了兩個進程(每種類型的飛機一個),每個進程都在制作幾個線程(一個線程是一架飛機)。

每個線程都運行 Pilot function,它在輸入中采用 structureVol(數據結構)並執行以下操作:

  • 出發 function (等到關鍵資源空閑后再拿走)
  • 等待(模擬旅行)
  • 到達 function (與出發功能相同)
  • 殺死線程

我不明白為什么腳本運行時沒有錯誤並且幾乎沒有返回任何內容。 經過多次嘗試(使用printf("something") ),我發現腳本沒有使用 case 0,但 typeheavy 和 typelight 返回 0。

我還發現它只在初始化一個線程而不是它的數組時起作用。

經過幾個小時的工作,我不知道遮陽篷。

請原諒我的英語錯誤。

非常感謝。

#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;
}

您的代碼中有兩個錯誤,第一個是您應該在每個案例的末尾放置一個 break(或程序失敗),第二個是donneesVol未初始化,您更正的代碼是這樣的:

#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
#define BUF_SIZE 100

//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[BUF_SIZE];

    //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, &donneesVol[i]);
                /*  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, &donneesVol[i]);
                /*  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);

            }
            break;

        default: /* Controleur (poursuit le programme) */
            wait(0);
            printf("wait passé\n");

    }

    printf("\n  -----        Fin du programme       ----- \n");
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM