天天看點

Linux_C程式設計—pthread_join()的使用

以我目前的知識儲備,我對線程執行的了解就是:在一個程序中建立了一個線程,此線程調用了一個函數,可以在程序中通過這個線程所調用的函數來執行一些其他工作,或者輔助程序工作。由于CPU是單核,一般的來講隻要程序一直處于main程式的運作過程時,線程所調用的函數是不會執行的,因為程序沒有給線程留有執行的時間。要想使線程執行,一般的操作就是使程序休眠一段時間,通過

sleep()

函數可以實作,在程序休眠的這段時間内,線程的可以運作。程序的休眠通常實在建立完線程之後,還有一種方法,可以讓線程在程式運作到指定的步驟來執行線程,這就是

pthread_join()

函數。

建立好一個線程後,在程序中調用

pthread_join()

可以使程序等待線程執行完畢,這個函數是一個線程阻塞函數,調用它的程序将一直等待到線程執行完畢為止,而且當函數傳回時,線程的資源将被收回。

如果一個線程運作結束但沒有被join,則此線程的狀态就像程序中的Zombie Process,是以一般最好使用

pthread_join()

來等待線程運作結束,并且可以得到線程的傳回值并釋放線程資源。

函數原型:

#include <pthread.h>

int pthread_join( pthread_t thread, void **value_ptr );
           
  • thread:程序要等待的線程的id,線程的id可以在建立線程的時候擷取
  • value_ptr:一個使用者定義的指針,用來存儲線程的傳回值,通常會定義一個指針,通過指針的位址來存儲線程的傳回值。比如:
void *p;
error = pthread_join( tid, &p );
           
  • 傳回值:若阻塞成功則傳回0;不成功傳回出錯的編号,通常把接收傳回值的變量命名為error,這樣其含義就更容易了解,可以通過如下代碼來判斷阻塞的成功與否:
if( error )
{
	printf("thread join failed!\n");
}
           

繼續閱讀