函数返回后线程停止

时间:2018-05-25 07:24:44

标签: c linux multithreading threadpool

我试图在一个名为engine_setup的函数中创建多个线程工作者,但每次函数返回时,每个线程也会停止。我试图创建pthread id作为全局指针,但没有帮助。 这是全球的:pthread_t * threadIDs; engine_setup函数:

query_helper* engine_setup(size_t n_processors) {
    //some code that is not relevant
    int err;
    threadIDs=malloc(n_processors*sizeof(*threadIDs));
    for(int i=0;i<n_processors;i++){
      err = pthread_create(&threadIDs[i],NULL,tp,(void*)helper);
      if (err != 0)
      printf("can't create thread \n");
    }
    printf("end setup\n");
    return helper;
}

并且线程函数指针在这里:

void* tp(void * ptr){
    query_helper * helper=(query_helper*)ptr;
    while(1){
        printf("1\n");
    }
}

输出是这样的:

1
1
1
1
1
1
1
1
1
end setup

表示在engine_setup返回时所有线程都停止了。有没有办法让它们继续运行?

2 个答案:

答案 0 :(得分:1)

函数返回后程序是否退出?如果是这样,你想在每个线程上使用pthread_join,以便程序在退出之前等待每个线程终止。

答案 1 :(得分:0)

是的,你可以调用pthread_join(threadIds [i],null); (对于所有线程i),它将一直等到thred函数返回。

您可以使用第二个参数来存储线程的返回值。 即:

void *results[n_processors];
for(int i=0; i<n_processors; i++){
    pthread_join(threadIds[i], &results[i]);
}