有关pthread_join()和pthread_create()

时间:2016-10-04 07:14:24

标签: linux process pthread-join

这是pthread_create的声明:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *  
          (*start_routine) (void *), void *arg);

它包含一个函数start_routine。

所以当我们调用pthread_create时,函数将使用param arg执行。
那么为什么需要调用pthread_join(),因为要执行start_routine函数?
我也尝试不包括pthread_join()函数,确实根本没有执行start_routine函数,并且该进程在创建后才退出。
那么当程序来到pthread_create时,究竟会发生什么呢? param start_routine的执行是否有条件?
混乱... 这是我的测试代码:

#include <pthread.h>
#include <stdio.h>
int sum;
void* runner(void *param);

int main(int argc, char *argv[])
{
    pthread_t tid; //The thread identifier
    pthread_attr_t attr;//set of thread attributes

    if(argc!=2){
    fprintf(stderr, "usage:a.out <integer value>\n");
    return -1;
    }
    if(atoi(argv[1])<0){
    fprintf(stderr, "%d must be <=0\n",atoi(argv[1]));
    return -1;
    }


    //get the default attributes
    pthread_attr_init(&attr);
    //create the thread
    pthread_create(&tid,&attr,runner,argv[1]);
    //now wait for the thread to exit
    pthread_join(tid,NULL);

    printf("sum=%d\n", sum);
}

    void* runner(void *param)
    {
        int i,upper = atoi(param);
        sum=0;

        for(i=1;i<=upper;i++)
            sum+=i;

        pthread_exit(0);
    }

2 个答案:

答案 0 :(得分:0)

如果在pthread_join之前退出应用程序或进程,则进程不会等待start_routine应用程序完成执行。它将与所有资源一起杀死线程

答案 1 :(得分:0)

  1. 通常,您的例行程序将被调用。如果它没有任何事情要做和退出,那么你的线程生命就完成了。
  2. 你的start_routine()是否有任何代码/打印语句可用来验证/调试其功能?
  3. 不需要调用pthread_join()。如果要在完成/终止执行(内部/外部)后等待start_routine(),则需要它。并检查线程函数的返回状态。
  4. 线程不运行的其他情况可能是:系统内存非常低或现有线程(及其优先级)占用系统太多,以至于它没有任何机会运行。
  5. 您是否还检查了pthread_create()的错误代码?
  6. 如果您可以共享测试代码,包括pthread_create()和start_routine()的调用者,将会有所帮助。