pthread_join free():指针错误无效

时间:2013-11-16 21:49:36

标签: c multithreading pointers pthreads

我有这样一段代码:

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 个答案:

答案 0 :(得分: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], ...