pthread_detach()函式、pthread_join()函式的區別、執行緒與這兩個函式的聯絡
阿新 • • 發佈:2018-12-20
#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():可以終止正在執行的一個執行緒。