(轉載)pThreads線程(一) 基本API
1.創建線程
int pthread_create(pthread_t *restrict_ptid,
const pthread_attr_t *restrict_attr,
void *(*start_routine)(void*), void *restrict_arg);
ptid是一個pthread_t *類型的指針,pthread_t是類似pid_t的數據結構,表示線程ID;attr指明線程創建屬性,如果為NULL就使用系統默認屬性;start_routine是線程的主函數,它的參數是void *類型的指針,返回值也是void *類型的指針;arg是線程創建者傳遞給新建線程的參數,也就是start_routine的參數,如果需要向start_routine函數傳遞的參數不止一個,那麽需要把這些參數放到一個結構中,然後把這個結構的地址作為restrict_arg的參數傳入。(若線程創建成功,則返回0。若線程創建失敗,則返回出錯編號)
註意:線程創建者和新建線程之間沒有fork()調用那樣的父子關系,它們是對等關系。調用pthread_create()創建線程後,線程創建者和新建線程哪個先運行是不確定的,特別是在多處理機器上。
2.終止線程
void pthread_exit(void *value_ptr);
線程調用pthread_exit()結束自己,參數value_ptr作為線程的返回值被調用pthread_join的線程使用。由於一個進程中的多個線程是共享數據段的,因此通常在線程退出之後,退出線程所占用的資源並不會隨著線程的終止而得到釋放,但是可以用pthread_join()函數來同步並釋放資源。
3.pthread_self():該函數返回調用線程的ID.這個數值與調用 pthread_create 創建本線程時使用的*thread 參數返回的值是一樣的。
註意:Thread IDs 僅僅保證在一個進程內部的唯一性。當一個結束了的線程 joined(使用join等待一個線程結束)之後, 或者一個detached 狀態的線程被結束 thread ID可能會被重新使用。 pthread_self()返回的線程ID與 調用 gettid()得到的內核線程ID是不一樣的。
4.pthread_equal():比較線程ID,線程ID的大小沒有意義。
引入原因:在線程中,線程ID的類型是pthread_t類型,由於在Linux下線程采用POSIX標準,所以,在不同的系統下,pthread_t的類型是不同的,比如在ubuntn下,是unsigned long類型,而在solaris系統中,是unsigned int類型。而在FreeBSD上才用的是結構題指針。 所以不能直接使用==判讀,而應該使用pthread_equal來判斷。
3.取消線程
int pthread_cancel(pthread_t thread);
註意:若是在整個程序退出時,要終止各個線程,應該在成功發送 CANCEL指令後,使用 pthread_join函數,等待指定的線程已經完全退出以後,再繼續執行;否則,很容易產生 “段錯誤”。
4.連接線程(阻塞)
int pthread_join(pthread_t thread, void **value_ptr);
等待線程thread結束,並設置*value_ptr為thread的返回值。pthread_join阻塞調用者,一直到線程thread結束為止。當函數返回時,被等待線程的資源被收回。如果進程已經結束,那麽該函數會立即返回。並且thread指定的線程必須是joinable的。
線程終止有一下幾種方法:
1.從主函數返回;
2.自己調用pthread_exit();
3.其他線程調用pthread_cancel();
4.線程所屬的進程中任何線程調用exit()導致所有線程結束。
5.分離線程
int pthread_detach(pthread_t thread);
分離線程的語意是,線程thread結束後系統可以回收它的私有數據。
註釋:pthread有兩種狀態joinable狀態和unjoinable狀態 一個線程默認的狀態是joinable,如果線程是joinable狀態,當線程函數自己返回退出時或pthread_exit時都不會釋放線程所占用堆棧和線程描述符(總計8K多)。只有當你調用了pthread_join之後這些資源才會被釋放。若是unjoinable狀態的線程,這些資源在線程函數退出時或pthread_exit時自動會被釋放。unjoinable屬性可以在pthread_create時指定,或在線程創建後在線程中pthread_detach自己,如:pthread_detach(pthread_self())或者父線程調用pthread_detach(thread_id)結束相應子進程。
原文地址:http://www.cnblogs.com/dongsheng/p/4184153.html
(轉載)pThreads線程(一) 基本API