1. 程式人生 > 其它 >07LinuxC執行緒學習之pthread_exit函式和大總結exit、return、pthread_exit,pthread_join各自退出效果

07LinuxC執行緒學習之pthread_exit函式和大總結exit、return、pthread_exit,pthread_join各自退出效果

技術標籤:多執行緒linux

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():阻塞等待回收子執行緒。

例子案例後面的將再寫一篇文章總結。