線程的基本函數

1,int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

pthread_t *thread:傳遞一個pthread_t變量地址進來,用於保存新線程的tid(線程ID

const pthread_attr_t *attr:線程屬性設置,如使用默認屬性,則傳NULL
void *(*start_routine) (void *):函數指針,指向新線程應該加載執行的函數模塊
void *arg:指定線程將要加載調用的那個函數的參數
 返回值:成功返回0,失敗返回錯誤號。以前學過的系統函數都是成功返回0,失敗返回-1,而錯誤號保存在全局變errno中,而pthread庫的函數都是通過返回值返回錯誤號,雖然每個線程也都有一個errno,但這是爲了兼容其它函數接口而提供的,pthread庫本身並不使用它,通過返回值返回錯誤碼更加清晰。
2,pthread_t pthread_self(void); 獲取調用線程tid,需注意的是子線程裏的pthread_self()得到的結果並不完全等同於主線程裏pthread_creat得到的tid。
3,int pthread_detach(pthread_t tid);
pthread_t tid:分離線程tid
返回值:成功返回0,失敗返回錯誤號
函數說明:(pthread_detach函數與pthread_join函數是互斥的)
 一般情況下,線程終止後,其終止狀態一直保留到其它線程調用pthread_join獲取它的狀態爲止。但是線程也可以被置爲detach狀態,這樣的線程一旦終止就立刻回收它佔用的所有資源,而不保留終止狀態。不能對一個已經處於detach狀態的線程調用pthread_join,這樣的調用將返回EINVAL。對一個尚未detach的線程調用pthread_joinpthread_detach都可以把該線程置爲detach狀態,也就是說,不能對同一線程調用兩次pthread_join,或者如果已經對一個線程調用了pthread_detach就不能再調用pthread_join了。
4,int pthread_equal(pthread_t t1,pthread_t t2);
比較兩個線程是否相等
5,void pthread_exit(void *retval);
功能:使用函數pthread_exit退出線程,這是線程的主動行爲;由於一個進程中的多個線程是共享數據段的,因此通常在線程退出之後,退出線程所佔用的資源並不會隨着線程的終止而得到釋放,但是可以用pthread_join()函數來同步並釋放資源。
退出一個線程,但是不會退出當前進程,如果任意一個線程調用了exit_exit,則整個進程的所有線程都終止,
A: 調用線程退出函數,注意和exit函數的區別,任何線程裏exit導致進程退出,其他線程未工作結束,主控線程退出時不能returnexit
B:需要注意,pthread_exit或者return返回的指針所指向的內存單元必須是全局的或者是用malloc分配的,不能在線程函數的棧上分配,因爲當其它線程得到這個返回指針時線程函數已經退出了(所以此時的線程函數的棧已經不存在了,所以沒有意義)

6,int pthread_join(pthread_t thread,void **retval);
pthread_t thread:回收線程的tid
void **retval:接收退出線程傳遞出的返回值
返回值:成功返回0,失敗返回錯誤號
調用該函數的線程將掛起等待,直到idthread的線程終止。thread線程以不同的方式終止,通過pthread_join得到的終止狀態是不同的,總結如下:
  1. 如果thread線程通過return返回,value_ptr所指向的單元裏存放的是thread線程函數的返回值。
  2. 如果thread線程被別的線程調用pthread_cancel異常終止掉,value_ptr所指向的單元存放的是常熟PTHREAD_CANCELED.
  3. 如果thread線程是自己調用pthread_exit終止的,value_ptr所指向的單元存放的是傳給pthread_exit的參數。
  4. 如果對thread線程的終止狀態不感興趣,可以傳NULLvalue_ptr參數。
7,int pthread_cancel(pthread_t thread);
函數說明:被取消的線程,退出值,定義在Linuxpthread庫中常數PTHREAD_CANCELED的值是-1.可以在頭文件pthread.h中找到它的定義:#define PTHREAD_CANCELED ((void *) -1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章