Я пытаюсь использовать 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;
'' mychunkD.sample' имеет chunkSize/off_set' элементы выделяются, в то время как вы итерацию в 'chunkSize'. –
У вас также есть дополнительное направление, которое кажется. Вы уверены, что второй '&' in 'memcpy (& g_samples [i * ps], & (mythrD [i] .sample), ps * sizeof (long int)), необходимо. Я думаю, что 'mythrD [i] .sample' уже является указателем на ваши данные. – LambdaBeta
'* mythrD' выделялась память для' ps' элементов, но позже вы индексировали до 'ps * ps' элементов. –