pthread_detach()函数、pthread_join()函数的区别、线程与这两个函数的联系

本文深入探讨了pthread线程管理的细节,包括pthread_detach(), pthread_join()和pthread_exit()的使用,以及它们如何影响线程的生命周期。通过具体示例,展示了如何控制线程的独立性和同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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():可以终止正在运行的一个线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值