Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中使用进程中的线程数组_C_Multithreading_Operating System - Fatal编程技术网

如何在C中使用进程中的线程数组

如何在C中使用进程中的线程数组,c,multithreading,operating-system,C,Multithreading,Operating System,这是我关于机场结构的项目。我做了两个过程(每种飞机一个),每个过程都做了几个线程(一个线程就是一架飞机) 每个线程运行引导函数,该函数在输入中采用structureVol(数据结构),并执行以下操作: 出发功能(等待关键资源空闲后再出发) 等待(模拟行程) 到达功能(与出发功能相同) 压井线程 我不明白为什么脚本运行时没有错误,几乎什么也没有返回。 在多次尝试之后(使用printf(“something”)),我发现脚本没有使用case 0,而是使用typeheavy和typelight返回

这是我关于机场结构的项目。我做了两个过程(每种飞机一个),每个过程都做了几个线程(一个线程就是一架飞机)

每个线程运行引导函数,该函数在输入中采用structureVol(数据结构),并执行以下操作:

  • 出发功能(等待关键资源空闲后再出发)
  • 等待(模拟行程)
  • 到达功能(与出发功能相同)
  • 压井线程
我不明白为什么脚本运行时没有错误,几乎什么也没有返回。 在多次尝试之后(使用
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;
}

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
pthread\u mutex\u t mutexistecort=pthread\u mutex\u初始值设定项//短飞机着陆带互斥器
pthread\u mutex\u t mutexistelongue=pthread\u mutex\u初始值设定项//长飞机着陆带互斥器
#定义临时通行证5//Temps passésur une piste(décoller et attérir)//着陆带上的时间
#定义临时机场5//Temps max passédans un aéroport//机场时间
#定义tempsFrance 10//Temps max de trajet en France//穿越法国的时间
#定义tempsEurope 25//Temps max de trajet en Europe//穿越欧洲的时间
#定义nbAvionsLourd 5
#定义nbAvionsLeger 2
//原型
void attente();//等待函数
无效离开(int,int)//发车功能
无效到达(int,int)//到达函数
无效附加(int,char*)//显示功能
空*有毛(空*)//先导功能
//结构报告人les données de vol//存储结构数据(id航班、类型、目的地等)
typedef结构structureVol
{
长id;
长型;
长途目的地;
}结构卷;
/*----------------*/
/*--方糖--*/
/*----------------*/
无效离开(inti,intj)//离开函数
{
printf(“离开公司”);//测试
如果(j==0)
{
pthread_mutex_lock(&mutexpistecout);
attente(tempsPiste);
pthread_mutex_unlock(&mutexpitecut);
}
如果(j==1)
{
pthread_mutex_lock(&mutexPisteLongue);
attente(tempsPiste);
pthread_mutex_unlock(&mutexPisteLongue);
}
其他的
{
printf(“Erreur sur l'Attribute piste décollage”);
}
/*做
部分独立学院
普通服装独立展
在总理的空间控制出动中,独立的飞行路线
报告点
Donner l'heure de décolage et sa limite。
这是一个很好的例子
我们将为您提供最大限度的服务
延迟莫延勒加费布尔
*/
}
void arrivee(inti,intj)//到达函数
{
printf(“公司协议”);//测试
如果(j==0)
{
pthread_mutex_lock(&mutexpistecout);
attente(tempsPiste);
pthread_mutex_unlock(&mutexpitecut);
}
如果(j==1)
{
pthread_mutex_lock(&mutexPisteLongue);
attente(tempsPiste);
pthread_mutex_unlock(&mutexPisteLongue);
}
其他的
{
printf(“归属地上的错误”);
}
/*做
《普通铁路线路描述》一书
申请表的首字母缩写为jusqu'au point d'approach,jusqu'au point
意味深长的机场跑道入口
在进行评估的过程中,应采用适当的方法进行评估。
*/
}
void*Pilote(void*arg)//导频函数
{
structureVol*donnees=(structureVol*)参数;
/*离开拉维昂*/
printf(“Début du thread”);
出发(唐尼人->身份证,唐尼人->类型);
fprintf(标准,“\033[9100万卷%ld de type%ld a démarer\033[0m\n],唐尼->身份证,唐尼->类型);
/*航空之旅*/
attente(tempsFrance);//法国航空公司
出席(临时港口);//在港口的车站
attente(tempsFrance);//法兰西河畔的阿维昂
/*阿利维翁酒店*/
到达(收件人->id,收件人->类型);
fprintf(标准,“\033[9100万卷%ld de type%ld s'est bien terminé\033[0m\n],donnees->id,donnees->type”;
pthread_exit(NULL);//Fin thread
}
void attente(int i)/*在1和1秒之间等待一段时间
{
//使用临时通信系统的原子命名率初始化
srand(时间(空));
int temps=rand()%i+1;
printf(“出席%d秒”,临时);
睡眠(临时);
}
void affichage(inti,char*texte)//显示函数
{
#定义科隆10
INTK,Espace;
Espace=i*COLONNE;
对于(k=0;ktype=0;
donneesVol->destination=0;
**---创建非线程线程——**
thr=pthread_create(&avionleger[i],NULL,Pilote,(void*)donneesVol);
/*易怒螺纹*/
如果(thr)
{
printf(“螺纹%d类型avion léger上的错误”,i);
}

对于(i=0;i您的代码中有两个错误,第一个错误是您应该在evry案例的末尾加一个中断(或程序失败),第二个错误是
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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
pthread_mutex_t mutexPi