POSIX多线程API函数
?創建
int pthread_create(pthread_t* tidp,const pthread_attr_t* attr,void* (*start_rtn)(void*), void* arg )tidp:事先創建好的pthread_t類型的參數。成功時tidp指向的內存單元被設置為新創建線程的線程ID。
attr:定義新線程的一些屬性(配置項),包括線程棧[stack]、分離狀態[detach?state]等,大部分情況下默認值即可(NULL)
start_rtn:線程運行函數的地址,新創建的線程從start_rtn函數的地址開始運行
arg:start_rtn函數的參數。無參數時設為NULL即可。有參數時輸入參數的地址。
如果調用成功,創建出一個新線程執行函數start_rtn(arg),線程號會被填入tidp,調用處收到返回值0,繼續執行后續代碼。如果調用失敗返回非0錯誤碼。
等待結束?
int pthread_join(pthread_t tid, void** thread_return)以阻塞的方式等待tid指定的線程結束,當函數返回時,被等待的線程資源被收回。如果線程已經結束,那么該函數會立即返回。
退出
一個線程可以通過以下3種方式結束:
發送信號
int pthread_kill(pthread_t threadId, int signal);向線程發送一個信號。返回值:成功返回0,失敗返回失敗碼。
獲取線程ID
pthread_t pthread_self(void);線程分離:
int pthread_detach(pthread_t tid);?返回值:成功返回0,失敗返回錯誤號。
線程分離就是當線程被設置為分離狀態后,線程結束時,它的資源會被系統自動的回收,而不再需要在其它線程中對其進行 pthread_join() 操作。
為什么線程分離
在我們使用默認屬性創建一個線程的時候,線程是 joinable 的。 joinable 狀態的線程,必須在另一個線程中使用 pthread_join() 等待其結束,如果一個 joinable 的線程在結束后,沒有使用 pthread_join() 進行操作,這個線程就會變成”僵尸線程”。每個僵尸線程都會消耗一些系統資源,當有太多的僵尸線程的時候,可能會導致創建線程失敗。
一個簡單的例子:
void* worker(void* arg) {//do somethingreturn (void*)ret; } int main(int argc, char* argv[]) {pthread_t tid; if (pthread_create(&tid, NULL, worker, &task) != 0) {return -1; } void* ret; pthread_join(tid, &ret); return (int)ret; }總結
以上是生活随笔為你收集整理的POSIX多线程API函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: akka kafka java_当使用w
- 下一篇: 为什么多个线程不可能同时抢到一把锁_并发