#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void create_pthread(void);
void pthread1(void);
void pthread2(void);
pthread_t thread;
pthread_t thread1;
void create_pthread(void)
{
printf("create pthread1:\n");
pthread_create(&thread,NULL,(void *)&pthread1,NULL);
pthread_detach(thread);
pthread_create(&thread1,NULL,(void *)&pthread2,NULL);
pthread_detach(thread1);
}
void pthread2(void)
{
char buf[10];
while(1)
{
fgets(buf,sizeof(buf),stdin);
fputs(buf,stdout);
printf("-----starting pthread2-------\n");
}
return;
}
void pthread1(void)
{
while(1)
{
printf("-----starting pthread1-------\n");
sleep(1);
}
return;
}
int main(void)
{
printf("-----starting main pthread-------\n");
create_pthread();
sleep(5);
printf("end main pthread\n");
return 0;
}
执行结果:main函数结束,pthread1也跟着结束
主线程结束,pthread1也跟着结束。因为此时程序进程已经结束,所有的线程终将会被回收掉。
有两种方法可以使pthread1在主线程结束的时候继续执行,执行中途使用pthread_exit()函数退出主线程,或者是让主线程一直存在不结束。
方法一:pthread_exit()
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void create_pthread(void);
void pthread1(void);
void pthread2(void);
pthread_t thread;
pthread_t thread1;
void create_pthread(void)
{
printf("create pthread1:\n");
pthread_create(&thread,NULL,(void *)&pthread1,NULL);
pthread_detach(thread);
pthread_create(&thread1,NULL,(void *)&pthread2,NULL);
pthread_detach(thread1);
}
void pthread2(void)
{
char buf[10];
while(1)
{
fgets(buf,sizeof(buf),stdin);
fputs(buf,stdout);
printf("-----starting pthread2-------\n");
}
return;
}
void pthread1(void)
{
while(1)
{
printf("-----starting pthread1-------\n");
sleep(1);
}
return;
}
int main(void)
{
printf("-----starting main pthread-------\n");
create_pthread();
sleep(5);
printf("end main pthread\n");
pthread_exit("end"); //退出main pthread这个线程,但是进程并没退出,所以接着执行后面的线程
return 0;
}
执行结果:主线程退出,pthread1继续执行
方法二:使用while(1)让main不会退出
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void create_pthread(void);
void pthread1(void);
void pthread2(void);
pthread_t thread;
pthread_t thread1;
void create_pthread(void)
{
printf("create pthread1:\n");
pthread_create(&thread,NULL,(void *)&pthread1,NULL);
pthread_detach(thread);
pthread_create(&thread1,NULL,(void *)&pthread2,NULL);
pthread_detach(thread1);
}
void pthread2(void)
{
char buf[10];
while(1)
{
fgets(buf,sizeof(buf),stdin);
fputs(buf,stdout);
printf("-----starting pthread2-------\n");
}
return;
}
void pthread1(void)
{
while(1)
{
printf("-----starting pthread1-------\n");
sleep(1);
}
return;
}
int main(void)
{
printf("-----starting main pthread-------\n");
create_pthread();
sleep(5);
printf("end main pthread\n");
while(1)
{
sleep(1);
}
return 0;
}
执行结果:两个都在执行
上面都是使用pthread_detach()来使pthread1分离状态,我们也可以使用pthread_join()来使线程变为等待回收状态:
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void create_pthread(void);
void pthread1(void);
void pthread2(void);
pthread_t thread;
pthread_t thread1;
void create_pthread(void)
{
printf("create pthread1:\n");
pthread_create(&thread,NULL,(void *)&pthread1,NULL);
//pthread_detach(thread);
pthread_join(thread,NULL);
pthread_create(&thread1,NULL,(void *)&pthread2,NULL);
pthread_detach(thread1);
}
void pthread2(void)
{
char buf[10];
while(1)
{
fgets(buf,sizeof(buf),stdin);
fputs(buf,stdout);
printf("-----starting pthread2-------\n");
}
return;
}
void pthread1(void)
{
int i=0;
//while(1)
for(i=0;i<5;i++)
{
printf("-----starting pthread1-------\n");
sleep(1);
}
return;
}
int main(void)
{
printf("-----starting main pthread-------\n");
create_pthread();
sleep(5);
printf("end main pthread\n");
return 0;
}
执行结果:main不会立即退出,它会等待pthread1执行完才一起被回收结束
到这里,如果还不明白,看下面这个例子,你就知道pthread_detach(),pthread_join()的区别了:
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void create_pthread(void);
void pthread1(void);
void pthread2(void);
pthread_t thread;
pthread_t thread1;
void create_pthread(void)
{
printf("create pthread1:\n");
pthread_create(&thread,NULL,(void *)&pthread1,NULL);
pthread_detach(thread);
pthread_create(&thread1,NULL,(void *)&pthread2,NULL);
pthread_detach(thread1);
}
void pthread2(void)
{
char buf[10];
while(1)
{
fgets(buf,sizeof(buf),stdin);
fputs(buf,stdout);
printf("-----starting pthread2-------\n");
}
return;
}
void pthread1(void)
{
while(1)
{
printf("-----starting pthread1-------\n");
sleep(1);
}
return;
}
int main(void)
{
printf("-----starting main pthread-------\n");
create_pthread();
//sleep(5);
printf("end main pthread\n");
/*
while(1)
{
sleep(1);
}
*/
return 0;
}
执行结果:
这里即使pthread1与main线程是分离的,但是main结束的实在是太快了,它还没来得及去执行pthread1整个进程就结束了。所以的线程都被回收掉。
总结:
pthread_detach():使线程分离子线程,他不依赖主线程(即与主线程无关),它单独占有资源。在主线程退出时,它还可以单独存在,运行。(前提是进程没有结束),这里注意,一旦进程结束退出,所有的线程资源都会被释放掉,线程也就全部终止,离开没有进程来说线程是无意义的。
pthread_join():子线程依赖于主线程,主线程先结束时不会立即终止,它会等待子线程结束时,才终止程序。
pthread_exit():可以终止正在运行的一个线程。