線程基本函數


  • 線程庫沒有包含在系統庫中,編譯時要進行鏈接  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.線程屬性

  1. 線程的分離狀態屬性  :可以用函數pthread_detach()函數來代替
  2. 線程的棧未尾警戒緩沖區大小 
  3. 線程棧最低地址
  4. 線程棧大小:    當有多個線程高並發時需要設置該屬性

    指定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為需要執行一次的函數,用戶自己寫

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM