- 線程庫沒有包含在系統庫中,編譯時要進行鏈接 gcc -l pthread
- 線程包括主線程和次線程,線程時平等的,共享數據短,棧空間,唯一不同的是棧空間不同
- tid不要打印
2.pthread_cread(tid,&attr,func,&arg) //成功返回0,錯誤返回錯誤碼
tid:線程id號;attr:線程屬性(大多填寫NULL,后面會祥解)
func:啟動例程;args:啟動例程的參數
如:pthread_create(tid,NULL,doWork,NULL);
3.pthread_join(tid,void **retval)
功能:等待線程號為tid的線程執行結束后回收線程資源,類似於進程的wait()函數,會阻塞。任何一個線程都可以回收其他線程
tid:等待回收的線程
retval:1.可以作為線程結束返回碼。判斷線程是否正常結束
2.接收線程結束時的返回的數據空間
4.pthread_exit(void *retval)
功能:結束線程,並返回結束碼:可以用0,1表示線程是否正常返回
也可以返回一個數據的地址,方便其他線程調用
5.Pthread_cancel(tid) //成功返回0,失敗返回erro
功能:對線程號為tid的線程發送取消請求
注:發送成功並不代表線程tid就會結束
原因:每個線程都有取消選項,是相應取消請求要看取消選項。
取消選項包括:可取消狀態和可取消類型
可取消狀態包含兩種:
- PTHREAD_CANCEL_ENABLE:可以被取消,但是具體行為還要看取消類型
- PTHREAD_CANCEL_DISABLE:不可以被取消
pthread_setcancelstate()://設置線程取消狀態
可取消類型也包括兩種:
- PTHREAD_CANCEL_DEFERRED 延遲取消(調用pthread_cancel並不會立即終止線程,而是繼續運行,達到某個取消點時才終止)
- PTHREAD_CANCEL_ASYNCHRONOUS 導步取消(線程可以在任何時間取消)
pthread_setcanceltype() //設置線程取消類型(理解:類似於進程上鎖的機制,在這期間是不能被取消的,保證數據完整)
pthread_testcancel() //設置取消點
6.pthread_self(void)//獲取線程id號
7.pthread_equal(pthread_t tid1,pthread_t tid2);//比較兩個線程的id號,相等返回0,失敗返回非0
8.線程退出時可以調用安排好的退出清理程序(類似於atexit)
void pthread_cleanup_push(void (*rtn)(void *),void *arg);//將清理程序入棧(清理程序安裝)
//execute為0彈出不執行 非0彈出並執行
void pthread_cleanup_pop(int execute); //這兩個函數成對出現,pop()可以寫在return后面不執行,但必須要寫。
注:當執行以下動作時調用清理函數
.調用pthread_exit
.響應取消請求
.execute非零調用pop
9. int pthread_detach(pthread_t tid); //如果不關心線程返回狀態,可以使線程進入分離狀態,分離的線程退出時,底層資源會立即回收,不需要再調用pthread_join()來回收資源,
10.線程屬性
- 線程的分離狀態屬性 :可以用函數pthread_detach()函數來代替
- 線程的棧未尾警戒緩沖區大小
- 線程棧最低地址
- 線程棧大小: 當有多個線程高並發時需要設置該屬性
指定stack大小不能小於 #define PTHREAD_STACK_MIN 16384
int pthread_attr_getstack(const pthread_attr_t *attr,void **stackaddr,void*size);
int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr,int size);//設置棧大小,但需要自 己申請一塊未使用的空間
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);//設置棧大小,系統自動分配空間
11.pthread_once()//在多線程中保證某件事情只被執行一次
初始化變量
pthread_once_t one=PTHREAD_ONCE_INIT;
//在線程的啟動例程中調用,無論哪個線程執行,都只會執行一次
pthread_once(&one,onceEvent); //onecEvent為需要執行一次的函數,用戶自己寫