c - 多线程数组的段错误

标签 c linux segmentation-fault debian

我正在尝试用 c 编写多线程数组排序程序。但是当我运行该程序时,出现“段错误”错误。 有人可以帮忙吗? 我应该改变什么?第一个数组应该是 300,另一个应该是 500。我们首先分别对序列进行排序。之后合并 2 个排序序列。我使用“gcc -pthreads -0 soru1 soru1.c”和“./soru1”命令。

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>
#define size 800

int orginal_dizi[size], dizi1[300], dizi2[500], dizi3[size];
int sayi,a=1;

int boyutbul(int *the)
{
    int number=-1;
    while(the[++number]!='\0'){}
    return number;
}

void*runner(void *param)
{
    int temp,i,k;
    int *bolum = param;
    sayi = boyutbul(bolum);
    printf("\n----------unsorted %d. array-----------\n\n",a);
    for(i=0; i<sayi;i++)
    printf("%d\n", bolum[i]);

    for(i=0; i<sayi;i++)
    {
        for(k=0; k<(sayi-i-1);k++)
        {
            if(bolum[k]>bolum[k+1])
            {
                temp=bolum[k];
                bolum[k]=bolum[k+1];
                bolum[k+1]=temp;
            }
        }
    }
    printf("\n----------sorted %d. array-----------\n\n",a);
    for(i=0; i<sayi;i++)
    printf("%d\n", bolum[i]);
    a++;
    pthread_exit(0);
}

int main()
{
    pthread_t tid1,tid2, tid3;
    int i=0;
    while(i<size)
    {
        int yenisayi=1+rand()%1500;
        int aynimi=0, j=0;
        while(j<i)
        {
            if(orginal_dizi[j]==yenisayi)
            {
                aynimi=1;
                break;
            }
        j++;
        }
        if(aynimi)
        continue;
        orginal_dizi[i]=yenisayi;
        i++;
    }
    for(i=0;i<size;i++)
    {
        if(i<(300))
        {
            dizi1[i]=orginal_dizi[i];
        }
        else
        {
            dizi2[i-(500)-1]= orginal_dizi[i];
        }
    }
    pthread_create(&tid1,NULL,runner,(void *)dizi1);
    pthread_join(tid1,NULL);

    pthread_create(&tid2,NULL,runner,(void *)dizi2);
    pthread_join(tid2,NULL);

    for(i=0; i<size;i++)
    {
        if(i<300)
        {
            dizi3[i]=dizi1[i];
        }
        else
        {
            dizi3[i]=dizi2[i-500];
        }
    }

    pthread_create(&tid3,NULL,runner,(void *)dizi3);
    pthread_join(tid3,NULL);

    FILE *fp;
    if((fp=fopen("son.txt","w"))== NULL)
    printf("Dosya acilamadi.");

    for(i=0;i<size;i++)
    {
        fprintf(fp, "%d\n", dizi3[i]);
    }
    fclose(fp);
    return 0;
}

最佳答案

此程序中没有多线程:每个线程立即加入;注意并行运行。

真正的问题出在 boyutbul 中,它试图通过查找 '\0' 来计算数组的长度。初始化数组的方式无法保证它们会以 0 结尾(事实上,它们不会有任何零),因此程序注定要越界访问它们。这是 UB。

关于c - 多线程数组的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50494227/

相关文章:

linux - md5deep ubuntu 安装 - 找不到命令

linux - 同屏执行外部命令

c# - 找不到或丢失文件

关于 ABC、继承和虚函数的 C++ 赋值,试图找出段错误等

c++ - 调用 Gtkmm textBuffer->insert 时出现段错误

c - 方法 sscanf() 不明确行为

c - C 中未调用的函数

c - 段错误 - 不知道错误在哪里

javascript - EM_JS : How to convert int argc, char **argv 到 JS 字符串数组?

C 程序-如何将 2 个字符串相互集成?