線程控制

線程控制

簡介

咱們能夠將線程看做爲一個依託於進程存在的獨立邏輯流,它擁有着獨立的線程ID,一組寄存器,棧,調度優先級和策略,信號屏蔽字,errno變量以及線程私有數據.
同時,進程的全部信息對全部線程共享,包括可執行程序的代碼,程序的全局內存和堆內存以及文件描述符.
關於全部線程共享進程堆內存的問題我查閱了一些資料.某些blog上說線程在共享堆內存的時候內核是對內存作了同步處理以及讀寫保護,因此全部的線程共享一個堆也是安全的.
這個問題暫時寫在前面,等我翻閱一些資料以後再嘗試着解釋線程共享堆的機制.安全

建立線程

  • 線程標識:就像每一個進程都有一個進程ID同樣,每一個線程都有一個線程ID,線程ID只有在所屬進程的上下文中才有意義.
    線程ID是用pthread_t數據類型來表示的,考慮到可移植性問題,咱們使用一個函數對兩個線程ID進行比較:函數

    #include<pthread.h>  
    
    int pthread_equal(pthread_t tid1, pthread_t tid2)  
    
                    //返回值:若相等則返回非0,不然返回0.  
    
    pthread_t pthread_self(void)  
                    //返回值:調用線程的線程ID
  • 函數原型:線程

    #include<pthread.h>  
    
    int pthread_create(pthread_t *restrict tidp, const pthread_attr_t * restrict attr,  
        void *(*start_rtn) (void *) void *restrict arg);  
    
                        //成功則返回0,不然返回錯誤編號.
  • 參數tidp:當pthread_create成功返回時新建立的線程ID會被放入tidp指向的內存單元.
  • 參數attr:設置不一樣的線程屬性,若是是NULL則爲默認屬性,後面咱們會介紹到.
  • 參數start_rtn:新建立的線程從start_rtn函數地址開始運行,若是須要向函數傳遞參數,那麼須要把這些參數放入一個結構中,而後把結構的地址做爲arg參數傳入.指針

終止線程

  • 進程中能夠經過exit退出整個進程,可是若是咱們在線程中調用exit則會退出整個進程.下面介紹三種退出線程的方式
    • 線程執行完畢從啓動例程返回,返回值是線程退出碼.
    • 線程能夠被同一進程中的其餘線程取消.
    • 線程調用pthread_exit退出.
  • 函數原型:rest

    #include<pthread.h>  
    
    void pthread_exit(void *rval_ptr)
  • rval_ptr參數:無類型指針,做爲線程結束的返回值.code

獲取線程返回值

  • 當咱們但願阻塞住並等待某個線程終止的時候能夠用pthread_joinblog

    #include<pthread.h>  
    
    int pthread_join(pthread_t thread, void **rval_ptr)  
    
                    //成功則返回0,不然返回錯誤編號.
  • thread參數:指定等待的線程ID
  • rval_ptr參數:得到指定線程調用exit的參數rval_ptr
  • 若是線程被取消,則rval_ptr參數則爲PTHREAD_CANCELED進程

  • 須要注意的是,當調用exit的時候,咱們傳入的參數能夠是一個複雜結構的指針.同時,這個結構所使用的內存最好在分配在堆上,由於當線程結束時該結構可能已經被釋放.內存

分離線程

  • 上文提到,如咱們須要經過調用pthread_join來回收一個結束進程的終止狀態.若是咱們並不關心這種狀態也不想形成內存泄露的話要怎麼作呢
    咱們能夠函數來對線程進行分離
  • 函數原型:資源

    #include<pthread.h>  
    
    int pthread_detach(pthread_t thread)  
    
                  //成功則返回0,不然返回錯誤編號.
  • 調用了pthread_detach函數的線程在終止後存儲器資源會被當即收回

取消同一進程的其餘線程

  • 函數原型:

    #include<pthread.h>  
    
    int pthread_cancel(pthread_t tid);  
    
                    //成功返回0,失敗則返回錯誤碼
  • 函數能夠令目標線程的行爲表現如同執行了pthread_exit(PTHREAD_CANCELED)同樣.
  • 目標線程能夠選擇忽略取消或者控制如何被取消,cancel函數並不等待線程終止,而是僅僅提出請求.

線程清理處理程序

  • 線程能夠安排它退出時須要調用的函數,其做用和atexit函數相似.
  • 函數原型:

    #include<pthread.h>  
    
    void pthread_cleanup_push(void (*rtn) (void *), void *arg)  
    
    void pthread_cleanup_pop(int execute)
  • 觸發條件:
    • 調用pthread_exit時.
    • 響應取消請求時.
    • 用非0 execute 參數調用pthread_cleanup_pop
相關文章
相關標籤/搜索