在上一篇文章中對線程進行了簡單的概述,它在系統中和編程的應用中,扮演的角色是不言而喻的。學習它、掌握它、吃透它是作為一個程式員的必須作為。在接下來的講述中,所有線程的操作都是使用者級的操作。在LINUX中,一般pthread線程庫是一套通用的線程庫,是由POSIX提出的,因此他的移植性是非常好的。
建立線程實際上就是確定調用該線程函數的進入點,這裡通常使用的函數是pthread_create。線上程建立之後,就開始運行相關的線程函數。在該函數運行結束,線程也會隨著退出。這是其中退出線程的一種方法,另外一種退出線程的方法就是調用pthread_exit()函數介面,這是結束函數的主動行為。在這裡要注意的是,在使用線程函數時,不要輕易調用exit()函數,因為這樣會使整個進程退出,往往一個進程包含著多個線程,所以調用了exit()之後,所有該進程中的線程都會被結束掉。因此,線上程中,利用pthread_exit來替代進程中的exit。
由於一個進程中的資料區段是共用的,因此通常線上程退出之後,退出線程所佔的資源並不會隨著線程的結束而得到釋放。正如進程之間可以調用wait()函數來同步中指並釋放資源一樣,線程之間也有類似的機制,那就是pthread_join函數.pthread_join可以將當前線程掛起,等待線程的結束,這個函數是一個阻塞函數,調用它的函數將一直等待到被等待的線程結束為止,當函數返回時,被等待函數的資源就會被釋放。
1、函數文法簡述。
pthread_create
標頭檔: pthread.h
函數原型: int pthread_create (pthread_t* thread, pthread_attr_t* attr,
void* (start_routine)(void*), void* arg);
函數傳入值: thread: 線程標識符
attr: 線程屬性設定
start_routine:線程函數入口
arg:傳遞給線程函數的參數
傳回值: 0: 成功
-1: 失敗
pthread_exit
標頭檔: pthread.h
函數原型: void pthread_exit (void* retval);
函數傳入值:retval:pthread_exit()調用者線程的傳回值,可又其他函數如pthread_join來檢索擷取。
phread_join
標頭檔: pthread.h
函數原型: int pthread_join (pthread_t* thread, void** thread_return);
函數傳入值:thread:等待線程的標識符。
thread_return:使用者定義的指標,用來儲存被等待線程的傳回值(不為NULL值);
函數傳回值:成功: 0
失敗:-1
2、函數舉例實現。
#include <stdlib.h><br />#include <stdio.h><br />#include <pthread.h><br />#include <errno.h> </p><p>static void* pthread_func_1 (void*);<br />static void* pthread_func_2 (void*); </p><p>int main (int argc, char** argv)<br />{<br /> pthread_t pt_1 = 0;<br /> pthread_t pt_2 = 0;<br /> int ret = 0; </p><p> ret = pthread_create (&pt_1, NULL, pthread_func_1, NULL);<br /> if (ret != 0)<br /> {<br /> perror ("pthread_1_create");<br /> } </p><p> ret = pthread_create (&pt_2, NULL, pthread_func_2, NULL);<br /> if (ret != 0)<br /> {<br /> perror ("pthread_2_create");<br /> } </p><p> pthread_join (pt_1, NULL);<br /> pthread_join (pt_2, NULL); </p><p> return 0;<br />} </p><p>static void* pthread_func_1 (void* data)<br />{<br /> int i = 0; </p><p> for (; i < 6; i++)<br /> {<br /> printf ("This is pthread1!/n"); </p><p> if (i == 2)<br /> {<br /> pthread_exit (0);<br /> } </p><p> sleep (1);<br /> } </p><p> return NULL;<br />} </p><p>static void* pthread_func_2 (void* data)<br />{<br /> int i = 0; </p><p> for (; i < 3; i++)<br /> {<br /> printf ("This is pthread2!/n");<br /> } </p><p> pthread_exit (0); </p><p> return NULL;<br />}<br />
在上面的例子中只是簡單的建立了線程、主動退出線程和掛起線程。在下一篇文章中,將講述線程線的屬性及其設定。
~~END~~