1. 程式人生 > >pthread_detach()函式、pthread_join()函式的區別、執行緒與這兩個函式的聯絡

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");
	
	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():可以終止正在執行的一個執行緒。