07LinuxC執行緒學習之pthread_exit函式和大總結exit、return、pthread_exit,pthread_join各自退出效果
阿新 • • 發佈:2021-01-06
1 pthread_exit函式
void pthread_exit(void *retval);
/*
功能:退出當前子執行緒。與在某個函式中返回區別一下。
參1:retval表示執行緒退出狀態,通常傳NULL。
*/
2 exit的作用
1)測試1
下面的程式和結果可以看到,當執行到第二個執行緒時,我們呼叫了exit(0),導致後面3,4,5執行緒沒有列印。也就是說,該函式會將整個程序退出,無論在哪個執行緒中。
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int func(int a){
exit(0);
}
void *tfn(void *arg){
int i;
i = (int)arg;
sleep(i);
if (i == 2){
func(8888);//測試1
//return NULL;//測試2
//func(8888);//測試3
}
printf("I'm %dth thread, Thread_ID = %lu\n", i+1, pthread_self());
pthread_exit (NULL);
}
int main(int argc, char *argv[]){
int n = 5, i;
pthread_t tid[n];
for (i = 0; i < n; i++) {
tid[i] = -1;
}
for (i = 0; i < n; i++) {
pthread_create(&tid[i], NULL, tfn, (void *)i);
}
//為了方便觀察,不回收
//for (i = 0; i < n; i++) {
//pthread_join(tid, NULL);
//}
printf("I am main, and I am not a process, I'm a thread!\n"
"main_thread_ID = %lu\n", pthread_self());
return 0;
}
程式結果:
3 return的作用
1)測試2
同樣的程式碼,我們將func函式中的exit改成return NULL,可以看到結果1能夠依次列印。
結果1:
2)測試3
然後再將return NULL封裝一下放在一個新的函式func中返回,重新呼叫func,可以看到結果2,我們想要退出執行緒3,但卻沒有退出。
void* func(){
return NULL;
}
結果2:
- 所以可以總結到return的作用是:返回到呼叫者處。有可能會退出程序(放在主執行緒時),有可能會退出執行緒,也有可能什麼也不退出。
3 pthread_exit的作用
將測試3的程式碼改成下面,可以看到結果,執行緒3退出了。所以pthread_exit的作用是隻退出當前子執行緒,記住是隻。即使你放在主執行緒,它也會只退出主執行緒,其它執行緒有執行的仍會繼續執行。
void* func(){
pthread_exit(NULL);
}
結果:
所以我們可以大總結這些退出函式的作用了。
4 總結exit、return、pthread_exit,pthread_join各自退出效果
- 1)return:返回到呼叫者那裡去。注意,在主執行緒退出時效果與exit,_exit一樣。即return有可能會退出程序(放在主執行緒時),有可能會退出執行緒,也有可能什麼也不退出。
- 2)pthread_exit():只退出當前子執行緒。注意:在主執行緒退出時,其它執行緒不會結束。同樣可以執行。所以這個隻字非常重要。
- 3)exit,_exit: 將程序退出,無論哪個子執行緒呼叫整個程式都將結束。
- 4)pthread_join():阻塞等待回收子執行緒。
例子案例後面的將再寫一篇文章總結。