使用pthread_join

时间:2016-05-17 16:24:55

标签: c linux multithreading pthreads pthread-join

我正在使用Linux系统上的线程做一些初步步骤,并且我遇到了这个错误,该错误基于一个获得n参数并创建n个线程数的程序。< / p>

以下是代码的重要部分:

线程应运行的功能:

void* function(void* arg){
    int id = (long)arg;

    printf("Thread #%ld created!\n",id);

    pthread_exit(0);
}

main函数

中代码的重要部分
int main(int argc, char **argv){

    if(argc != 3){
        printf("Usage: %s <num> <exp>\n",argv[0]);
        exit(-1);
    }

    int num = atoi(argv[1]), exp = atoi(argv[2]);
    long i;
    pthread_t threads[num];
    pthread_attr_t attr;

    printf("Creating %d threads \n",num);

    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);

    for (i = 0; i < num; i++) {
        pthread_create(&threads[i],&attr,function,(void*)i);
    }

    pthread_attr_destroy(&attr);

    for (i = 0; i < num; i++) {
        printf("Thread #%d is %ld\n", i, threads[i]);
    }

    for (i = 0; i < num; i++) {
        pthread_join(threads[num], NULL);
    }

}

注意带for函数的最后pthread_join循环,当我将它注释掉时,程序结束正常(退出代码0),但输出显然是错误的,因为并非所有线程都运行{在主进程退出之前{1}}。

当我没有发表评论时,我试图在我的Linux操作系统中使用终端时运行function,在我的IDE(CLion)中运行时segmentation fault (core dumped)运行。

我找不到任何错误,因为它是一个非常基本的程序,不应该有任何难以找到的,导致错误的问题是什么?

1 个答案:

答案 0 :(得分:2)

您应该使用pthread_join(threads[i], NULL);代替pthread_join(threads[num], NULL);。假设num通过参数设置为4。然后threads[num]指向不存在的数组的第5个元素,因为您已经分配了仅包含4个元素的数组。