【问题标题】:pthread_join free(): invalid pointer errorpthread_join free():无效指针错误
【发布时间】:2013-11-16 21:49:36
【问题描述】:

我有这么一段代码:

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的值,但我不知道如何解决。

【问题讨论】:

    标签: c multithreading pointers pthreads


    【解决方案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], ...
    

    【讨论】:

    • 对不起,我一开始没有发。我必须动态分配这个表。我已经编辑了我的问题。
    • @WojciechReszelewski:您可以使用[] 运算符访问动态分配数组中的元素。
    猜你喜欢
    • 1970-01-01
    • 2018-06-18
    • 2018-09-17
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多