为什么我的C语言多线程调度程序出现segmentation fault(core dumped)

Why is there segmentation fault(core dumped) in my multithreaded scheduling program in C

我必须用 C 编写一个多线程程序,其中一个线程显示 FCFS 调度的工作,另一个线程显示 SJF 调度。现在,如果我 运行 将两种类型的调度作为单独的 C 程序,我不会出错并且程序 运行 顺利。但是当我将它们放在两个不同的函数中并使用多线程的概念时,终端会打印错误"Segmentation fault (core dumped)"请帮帮我

#include <stdio.h>
#include <pthread.h>
void *fcfs(void *);
void *sjf(void *);
int pid[10],at[10],bt[10];
int pid1[10],at1[10],bt1[10];
void main()
{
    pthread_t fcfsT,sjfT;
    pthread_attr_t attr;
    int lower = 0, upper = 20, count = 10;
    int i;
    for(i=0;i<10;i++)
    {
        pid[i]=i+1;
    }
    for (i = 0; i < count; i++) {
        at[i] = (rand() % (upper - lower + 1)) + lower;
        bt[i] = (rand() % (upper - lower + 1)) + lower;
    }
    for(i=0;i<10;i++)
    {
        pid1[i]=pid[i];
        at1[i]=at[i];
        bt1[i]=bt[i];
    }
    pthread_attr_init(&attr);
    pthread_create(&fcfsT,&attr,fcfs, NULL);
    pthread_create(&sjfT,&attr,sjf,NULL);
    pthread_join(fcfsT,NULL);
    pthread_join(sjfT,NULL);
}

void *fcfs(void *p)
{
    int ct[10],a,wt[10],tat[10],i,j=0;
    for (i = 0; i < 10; ++i) 
    {
        for (j = i + 1; j < 10; ++j)
        {
            if (at[i] > at[j]) 
            {
                a =  at[i];
                at[i] = at[j];
                at[j] = a;
                a =  bt[i];
                bt[i] = bt[j];
                bt[j] = a;
                a =  pid[i];
                pid[i] = pid[j];
                pid[j] = a;
             }
         }
    }
    ct[0]=at[0]+bt[0];
    for(i=1;i<10;i++)
    {
        if(at[i]<ct[i-1])
            ct[i]=ct[i-1]+bt[i];
        else
            ct[i]=at[i]+bt[i];
    }

    for (i = 0; i < 10; ++i) 
    {
         for (j = i + 1; j < 10; ++j)
        {
            if (pid[i] > pid[j]) 
            {
                a =  pid[i];
                pid[i] = pid[j];
                pid[j] = a;
                a =  at[i];
                at[i] = at[j];
                at[j] = a;
                a =  bt[i];
                bt[i] = bt[j];
                bt[j] = a;
                a =  ct[i];
                ct[i] = ct[j];
                ct[j] = a;      
             }
         }
    }
    for(i=0;i<10;i++)
    {
        tat[i]=ct[i]-at[i];
        wt[i]=tat[i]-bt[i];
    }
    printf("PID\tAT\tBT\tCT\tTAT\tRT:\n\n");
    for(i=0;i<10;i++)
    {
        printf("P%d\t%d\t%d\t%d\t%d\t%d\n",pid[i],at[i],bt[i],ct[i],tat[i],wt[i]);
    }
    pthread_exit(0);
}

void *sjf(void *g)
{
    int ct1[10],b,wt1[10],tat1[10],z,q=0,minimum,location,temp[3]={0,0,0};
    for (z = 0; z < 10; ++z) 
    {
         for (q = z + 1; q < 10; ++q)
        {
            if (bt1[z] > bt1[q]) 
            {
                b =  bt1[z];
                bt1[z] = bt1[q];
                bt1[q] = b;
                b =  at1[z];
                at1[z] = at1[q];
                at1[q] = b;
                b =  pid1[z];
                pid1[z] = pid1[q];
                pid1[q] = b;
             }
         }
    }

    for (z = 0; z < 10; ++z) 
    {
        for (q = z + 1; q < 10; ++q)
        {
            if (bt1[z] == bt1[q]) 
            {
                if(at1[q]<at1[z])
                {
                    b =  bt1[z];
                    bt1[z] = bt1[q];
                    bt1[q] = b;
                    b =  at1[z];
                    at1[z] = at1[q];
                    at1[q] = b;
                    b =  pid1[z];
                    pid1[z] = pid1[q];
                    pid1[q] = b;
                }
            }
        }
    }
    minimum = at1[0];
    for ( z = 1 ; z < 10 ; z++ ) 
    {
        if ( at1[z] < minimum ) 
        {
           minimum = at1[z];
           location = z;
        }
    }
    temp[0] = at1[location];
    temp[1] = bt1[location];
    temp[2] = pid1[location];
    for(z=location;z>0;z--)
    {
        at1[z]=at1[z-1];
        bt1[z]=bt1[z-1];
        pid1[z]=pid1[z-1];
    }
    at1[0]=temp[0];
    bt1[0]=temp[1];
    pid1[0]=temp[2];
    ct1[0]= at1[0]+bt1[0];
    for(z=1;z<10;z++)
    {
        if(at1[z]>ct1[z-1])
            ct1[z] = at1[z]+bt1[z];
        else
            ct1[z] = bt1[z]+ ct1[z-1];
    }
    for (z = 0; z < 10; ++z) 
    {
         for (q = z + 1; q < 10; ++q)
        {
            if (pid1[z] > pid1[q]) 
            {
                b =  pid1[z];
                pid1[z] = pid1[q];
                pid1[q] = b;
                b =  at1[z];
                at1[z] = at1[q];
                at1[q] = b;
                b =  bt1[z];
                bt1[z] = bt1[q];
                bt1[q] = b;
                b =  ct1[z];
                ct1[z] = ct1[q];
                ct1[q] = b;

             }
         }
    }
    for(z=0;z<10;z++)
    {
        tat1[z]=ct1[z]-at1[z];
        wt1[z]=tat1[z]-bt1[z];
    }
    printf("pid1\tAT\tBT\tCT\tTAT\tRT:\n\n");
    for(z=0;z<10;z++)
    {
        printf("P%d\t%d\t%d\t%d\t%d\t%d\n",pid1[z],at1[z],bt1[z],ct1[z],tat1[z],wt1[z]);
    }
    pthread_exit(0);
}

在 sjf() 中,如果 at1[0] 是最小值,location 将永远不会被初始化,因此下面的循环很容易产生无效地址。

for(z=location;z>0;z--)
    {
        at1[z]=at1[z-1];
        bt1[z]=bt1[z-1];
        pid1[z]=pid1[z-1];
    }

当你运行处于“进程模式”时,很可能你的初始堆栈是零填充的,从而隐藏了你程序中的缺陷。初始线程堆栈中可能有其他陈旧数据。

正如评论所指出的,您应该在 SO 之前尝试使用某种级别的编译器诊断(和主动性)。每个人都愿意提供帮助,但您也应该培养帮助他人的技能。