2016-10-04 5 views
-2

Я пытаюсь использовать memcpy для сбора массива внутри структуры в массив в глобальной области. Я проверил свой код, и я могу проверить, что размер, который я выделяю для каждого массива, является правильным и идентичным. Я могу подтвердить, что моя проблема связана с mythrD.sample, но в этот момент я не видел ничего плохого. Вот мой фрагмент кода:После того, как поток присоединился к массиву внутри структуры, был разрушен в C

int main(int argc, char**argv) { 
    int numbers = atoi(argv[1]); 
    int ps = atoi(argv[2]); 
    int i; 
    thrD *mythrD = (thrD *) malloc(sizeof(thrD)*ps); 
    for (i = 0; i < ps; i++) 
    { 
     mythrD[i].pid = i; 
     mythrD[i].n = numbers; 
     mythrD[i].ps = ps; 
    } 

    long int * array = (long int *) malloc(sizeof(long int)*numbers); 
    long int * g_samples = (long int *) malloc(sizeof(long int)*(ps*ps)); 

    for (i = 0; i < numbers; i++) 
    { 
      array[i] = rand()%20; 
    } 

    for (i = 0; i < ps; i++) 
    { 
     data[i] = (long int*) malloc(sizeof(long int)*chunkSize); 
     memcpy(data[i],&array[i*chunkSize], chunkSize*sizeof(long int)); 
     mythrD[i].chunk = data[i]; 
    } 

    for (i=0; i < ps; i++) { 
     pthread_create(&ids[i], NULL, threadFn1, (void*)&(mythrD[i])); 
    } 

    pthread_barrier_wait(&mybarrier); 

    for (i=0; i < ps; i++) { 
     pthread_join(ids[i], NULL); 
    } 
    pthread_barrier_destroy(&mybarrier); 

    for (i = 0; i < ps; i++) 
    { 
     for (int j = 0; j < ps; j++) 
     { 
      printf("%ld ",mythrD[i].sample[j]); 
     } 
    } 

    for (i = 0; i < ps; i++) { 
     memcpy(&g_samples[i*ps], mythrD[i].sample, ps*sizeof(long int)); 
    } 

    for (i = 0; i< ps*ps; i++) { 
     printf("%ld ",g_samples[i]); 
    } 
    return 0; 
} 

void* threadFn1(void * chunkD) { 
    thrD mychunkD = *(thrD *) chunkD; 
    int off_set = mychunkD.n/(mychunkD.ps*mychunkD.ps); 
    int chunkSize = mychunkD.n/mychunkD.ps; 
    pthread_barrier_wait(&mybarrier); 
    mychunkD.sample = (long int *) malloc(sizeof(long int)*(chunkSize/off_set)); 
    for (int i = 0; i < chunkSize/off_set; i++) 
    { 
     mychunkD.sample[i] = mychunkD.chunk[i*off_set]; 
    } 
    return NULL; 
} 

А вот структура, что я определил:

typedef struct threadData{ 
    long int *chunk; 
    long int *sample; 
    int pid; 
    int n; 
    int ps; 
} thrD; 
+0

'' mychunkD.sample' имеет chunkSize/off_set' элементы выделяются, в то время как вы итерацию в 'chunkSize'. –

+0

У вас также есть дополнительное направление, которое кажется. Вы уверены, что второй '&' in 'memcpy (& g_samples [i * ps], & (mythrD [i] .sample), ps * sizeof (long int)), необходимо. Я думаю, что 'mythrD [i] .sample' уже является указателем на ваши данные. – LambdaBeta

+0

'* mythrD' выделялась память для' ps' элементов, но позже вы индексировали до 'ps * ps' элементов. –

ответ

0

Я понял эту проблему. Я не должен выделять память в threadFn, потому что, когда мы покинем поток, эта память будет потеряна. Если я назначу mythrD.sample в main, я должен уметь поддерживать это в основном объеме.

так и должно быть:

int main() 
{ 
    for(int i =0; i<ps; i++) 
    { 
     mythrD[i].sample = (long int *) malloc(sizeof(long int)*ps); 
    } 
}