Ошибка сегментации с многопоточным массивом - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь сделать программу сортировки многопоточных массивов в 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;
}

1 Ответ

0 голосов
/ 23 мая 2018

В этой программе нет многопоточности: каждый поток сразу присоединяется;noting работает параллельно.

Реальная проблема в boyutbul, который пытается выяснить длину массива путем поиска '\0'.То, как вы инициализируете массивы, не гарантирует, что у них будет завершающий 0 (фактически, у них не будет нулей), поэтому программа обречена на доступ к ним за пределами границ.Это UB.

...