关于 pthread_join() 和 pthread_create() 的问题
Questions on pthread_join() and pthread_create()
这是pthread_create的声明:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *
(*start_routine) (void *), void *arg);
它包含一个函数start_routine。
所以当我们调用pthread_create时,该函数将以参数arg执行。
那么为什么需要调用pthread_join(),因为start_routine函数是要执行?
我也试过不包含pthread_join()函数,确实start_routine函数根本不执行,创建后进程就退出了。
那么当程序来到pthread_create的时候,究竟会进行什么呢?参数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);
}
如果您在 pthread_join 之前退出应用程序或进程,进程将不会等待 start_routine
应用程序完成执行。它只会杀死线程以及所有资源
- 通常,您的例程会被调用。如果它无事可做并退出,您的线程生命就完成了。
- 您的 start_routine() 是否有任何 code/print 语句,您可以通过这些语句 verify/debug 它的功能?
- 不需要调用 pthread_join()。如果您想在 finishes/terminates 执行 (internally/externally) 之后等待 start_routine(),则需要它。并查看线程函数的return状态。
- 线程不 运行 的其他情况可能是:系统内存非常低或现有线程(及其优先级)占用系统太多以至于它没有任何机会运行.
- 您是否也检查了 pthread_create() 中的错误代码?
如果您能分享您的测试代码,包括 pthread_create() 和 start_routine() 的调用者,这将有所帮助。
这是pthread_create的声明:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *
(*start_routine) (void *), void *arg);
它包含一个函数start_routine。
所以当我们调用pthread_create时,该函数将以参数arg执行。
那么为什么需要调用pthread_join(),因为start_routine函数是要执行?
我也试过不包含pthread_join()函数,确实start_routine函数根本不执行,创建后进程就退出了。
那么当程序来到pthread_create的时候,究竟会进行什么呢?参数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);
}
如果您在 pthread_join 之前退出应用程序或进程,进程将不会等待 start_routine
应用程序完成执行。它只会杀死线程以及所有资源
- 通常,您的例程会被调用。如果它无事可做并退出,您的线程生命就完成了。
- 您的 start_routine() 是否有任何 code/print 语句,您可以通过这些语句 verify/debug 它的功能?
- 不需要调用 pthread_join()。如果您想在 finishes/terminates 执行 (internally/externally) 之后等待 start_routine(),则需要它。并查看线程函数的return状态。
- 线程不 运行 的其他情况可能是:系统内存非常低或现有线程(及其优先级)占用系统太多以至于它没有任何机会运行.
- 您是否也检查了 pthread_create() 中的错误代码?
如果您能分享您的测试代码,包括 pthread_create() 和 start_routine() 的调用者,这将有所帮助。