我有这样一段代码:
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的值时会出现问题,但我不知道如何修复它。
答案 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], ...