APUE學習筆記——線程控制

  1. 線程屬性使用的是結構體ptread_attr_t,它對應用程序是不透明的,這樣可以增強程序的可移植性。
  2. 可以使用ptread_attr_init進行初始化,使用ptread_attr_destroy進行反初始化(類似於釋放操作)。兩者必須配對出現。
  3. 如果要修改ptread_attr_t,必須調用相應的函數。
  4. 如果不關心線程的終止狀態,可以將線程設置成分離狀態(PTREAD_CRETE_DETACHED,PTREAD_CREATE_JOINABLE):ptread_attr_setdetachstate,也可以查詢線程的分離狀態設置:ptread_attr_getdetachstate。
  5. ptread_attr_destroy如果失敗將非常難處理。一般需要將線程銷燬,否則可能會造成內存泄露。
  6. ptread_attr_getstatck和ptread_attr_setstatck可以獲取和設置棧的大小。
  7. 如果既想更改棧的默認大小,又不想自己處理,可以使用函數ptread_attr_setstatcksize。
  8. 線程屬性guardsize可以設置避免棧溢出的
  9. 互斥量,讀寫鎖,條件變量也可以設置屬性
  10. 有些系統函數對線程是不可重入的。操作系統提供了相應的可重入函數,以_r結尾。
  11. 線程私有數據:則是一個非常實用的功能,之前我在一個項目中考慮過類似的問題:每個線程需要訪問自己私有配置數據(既能區分不同的線程,又有保護自己的數據不被其他線程使用的作用),但是沒有想出什麼好的方法。現在來看,線程自帶的私有數據是一個不錯的現成方法:
    1. 它的原理是:設置一個全局變量key,然後調用函數創建並對這個key進行初始化。之後每個線程可以malloc一段內存,然後設置線程私有的一些數據,最後調用系統函數和之前key進行關聯,這樣不用將動態申請的內存指針保存進全局變量中,後面可以通過函數,傳入key獲取之前設置的內存地址。內存的是否通過創建key時設置的析構函數進行。
    2. key的結構體定義爲ptread_key_t,可以使用函數int ptread_key_create(ptread_key_t *keyp, void (*destructor)(void *))進行設置。
    3. key創建後可以被進程中的所有的線程使用,但是每個線程都可以將key與不同的線程私有數據進行關聯。
    4. destructor可以設置key相關聯的析構函數。當線程退出時,如果私有數據不爲null,析構函數會被調用,入參爲私有數據的地址。只有在線程正常退出
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章