2013-11-16 2 views
0

У меня есть такой кусок коды:pthread_join бесплатно(): недопустимая ошибка указателя

void *write_parallel(void *num_for_chunk) { 

    struct rusage *sum = (struct rusage*) malloc(sizeof(struct rusage)); 
    if(sum==NULL) { 
     perror("Writing buffer: "); 
    } 

    sum->ru_utime.tv_sec = 0; 
    sum->ru_utime.tv_usec = 0; 
    sum->ru_stime.tv_sec = 0; 
    sum->ru_stime.tv_usec = 0; 

    pthread_exit(sum); 
} 

Я получил поточно таблицу:

pthread_t* thread_table = (pthread_t *) malloc(sizeof(pthread_t)*num_of_threads); 

Я создаю нить :

pthread_create(thread_table+(sizeof(pthread_t)*j),NULL,write_parallel,&num_for_chunk); 

И присоединиться:

pthread_join(*(thread_table+(sizeof(pthread_t)*j)),&part_res); 

Когда я запускаю программу, я получил:

*** Error in `./write_test': free(): invalid pointer: 0x00007f6b6e44a700 *** 

Я думаю, что есть проблема, когда нить исчезает, и я хочу, чтобы получить значение, которое было передано pthread_exit, но я не знаю, как почини это.

ответ

1

Предполагая thread_table быть объявить как массив pthread_t:

pthread_t thread_table[<some positive integer>]; 

или

pthread_t * thread_table = calloc(<some positive integer>, sizeof(*thread_table); 

просто удалить sizeof(pthread_t) при доступе к его элементы.

Так

pthread_create(thread_table+(sizeof(pthread_t)*j), ... 

станет

pthread_create(thread_table+j, ... 

И

pthread_join(*(thread_table+(sizeof(pthread_t)*j)), ... 

станет

pthread_join(*(thread_table + j), ... 

Фон: Приращение а (не void *) указатель T p по 1 перемещает указатель, чтобы указать на следующий элемент типа T. Это означает, что указатель увеличивается на sizeof(T) или, что равно, sizeof(*p) байтов.


Более простой и более прямой подход для доступа к элементам массива давал бы использовать оператор [] так:

pthread_create(&thread_table[j], ... 

... 

pthread_join(thread_table[j], ... 
+0

К сожалению, я не отправлял его на первый. Я должен динамически распределять эту таблицу. Я отредактировал свой вопрос. –

+0

@WojciechReszelewski: вы ** также ** можете обращаться к элементам в динамически распределенном массиве с помощью оператора '[]'. – alk

Смежные вопросы