pthread_join函数
pthread_join等待指定线程结束,并且回收资源。阻塞当前线程,等待其他线程执行pthread_exit或者线程结束。进程必须等待线程结束,否则执行结果可能不正确。
#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>void *thread_fun( void *argv){printf("thread_fun:%s\n",(char*)argv);for( int m =0; m <1000; m++)printf("thread_fun:parent pid %d, pid:%d, thread id:%ld----%d\n",getppid( ),getpid( ),pthread_self( ),m);return (void *)0;
}int main( int argc, char *argv[] ){printf("main begin\n");printf("main:parent pid %d, pid:%d, thread id:%ld\n",getppid( ),getpid( ),pthread_self( ));pthread_t tid;char *str = "hello world!"; pthread_create( &tid, NULL, thread_fun,(void *)str);printf("main end\n");return 0;
}
pthread_create( &tid, NULL, thread_fun,(void *)str);执行该语句后线程启动,线程中执行:
printf(“thread_fun:parent pid %d, pid:%d, thread id:%ld----%d\n”,getppid( ),getpid( ),pthread_self( ),m);
执行1000次。
但是程序运行过程中不会输出1000行,因为进程提前结束了。
执行结果:
程序正确执行,必须保证线程thread_fun执行结束后,进程才能结束。
可以在进程中加入sleep。
#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>void *thread_fun( void *argv){printf("thread_fun:%s\n",(char*)argv);for( int m =0; m <1000; m++)printf("thread_fun:parent pid %d, pid:%d, thread id:%ld----%d\n",getppid( ),getpid( ),pthread_self( ),m);return (void *)0;
}int main( int argc, char *argv[] ){printf("main begin\n");printf("main:parent pid %d, pid:%d, thread id:%ld\n",getppid( ),getpid( ),pthread_self( ));pthread_t tid;char *str = "hello world!"; pthread_create( &tid, NULL, thread_fun,(void *)str);//加入sleep,保证线程先执行结束。sleep(1);printf("main end\n");return 0;
}
使用sleep效率低,睡眠时间短可能线程还没有结束,睡眠时间长可能线程提前结束了。
使用pthread_join是不错选择。
#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>void *thread_fun( void *argv){printf("thread_fun:%s\n",(char*)argv);for( int m =0; m <1000; m++)printf("thread_fun:parent pid %d, pid:%d, thread id:%ld----%d\n",getppid( ),getpid( ),pthread_self( ),m);return (void *)2;
}int main( int argc, char *argv[] ){printf("main begin\n");printf("main:parent pid %d, pid:%d, thread id:%ld\n",getppid( ),getpid( ),pthread_self( ));pthread_t tid;char *str = "hello world!"; pthread_create( &tid, NULL, thread_fun,(void *)str);//加入sleep,保证线程先执行结束。//sleep(1);void* thread_ret; int result = pthread_join(tid, &thread_ret);printf("result:%d, thread_ret:%ld\n", result, (long)thread_ret);printf("main end\n");return 0;
}