APUE學習筆記——線程

  1. 採用多線程模式可以採用同步編程,而非異步編程,可以簡化編程;多個進程間可以很方便的共享數據;
  2. 可以通過pthread_self獲得自身的線程ID。線程ID只在進程內部唯一。
  3. 新創建線程不能保證那個線程先運行,新縣城可以訪問進程的地址空間,繼承線程的浮點環境和信號屏蔽字。
  4. 如果任意一個線程調用:exit,_Exit,_exit,進程都會終止。
  5. 線程終止方式:1)從啓動函數中返回,返回值就是線程的退出碼。2)可以被其他線程取消。3)線程調用pthread_exit。
  6. pthread_exit的入參就是現場的退出碼。
  7. 如果一個線程退出,其他線程就可以使用函數pthread_join來訪問到其他線程的退出碼。調用這個函數的線程將會一直阻塞,直到指定的線程調用ptread_exit,從主函數中退出,或者被取消。如果被其他的線程取消,rval_ptr指定的內存單元就被設置爲PTREAD_CANCELED。
  8. 線程的入口函數不要返回局部變量的地址(內存可能已經被回收),可以返回常量的地址(這裏錯了,應該是返回常量,數字常量地址如何獲取?)。(*void)1.或者全局變量的地址。如果是全局變量的話,在多個線程的時候要注意不要有衝突。
  9. ptread_create和ptread_exit無類型指針參數能傳遞的數字不止一個,可以是更復雜的結構體,但是這個內存必須是調用者完成調用之後必須是有效的。否則會訪問非法內存。錯誤的做法是使用棧中的變量地址返回。正確的方法包括:使用常量;動態申請內存(注意釋放內存,不要泄露);全局變量(注意多個進程間的衝突);
  10. 一個線程可以調用函數ptread_cancel來取消另外一個線程。
  11. 可以註冊線程取消時的執行函數。可以調用函數ptread_cleanup_push來註冊調用函數,註冊順序與執行順序相反。這些函數將在:1)線程調用ptread_exit函數時;2)響應取消請求時;3)調用函數ptread_cleanup_pop,且產生execute不爲0時執行。————如果線程從入口函數中返回而終止,則不會調用清除函數。
  12. 分離狀態的線程如果被取消,將不可以調用ptread_join等待他的終止狀態,會返回失敗。
  13. ptread_detach可以是線程處於分離狀態。
  14. 線程同步:如果變量時只讀的,不會產生同步問題。如果一個讀,一個寫,會有同步問題。
  15. 在變量修改時間多於一個存儲器訪問週期的處理器結構中,當存儲器讀與存儲器寫的週期交叉時,會出現不一致的現象。
  16. 多線程的原子操作深入分析?
  17. 互斥量:互斥量結構體爲ptread_mutex_t,初始化函數是ptread_mutex_init,銷燬函數是ptread_mutex_destroy。加鎖是ptread_mutex_lock,解鎖是ptread_mutex_unlock,嘗試加鎖而不阻塞(前面那個加鎖函數如果沒有成功這回阻塞)使用函數ptread_mutex_trylock。
  18. 死鎖產生:線程對一個鎖加鎖兩次;兩個線程各加在兩個互斥量上鎖,然後在對兩外一個線程已經加鎖的互斥量加鎖。
  19. 避免:1)一個線程同時只加一個鎖。2)否則的話,加鎖之前先釋放。3)如果多個鎖是有聯繫的,則對其中一個加鎖的時候,必然對多個鎖同時加鎖。
  20. 鎖顆粒度太粗,則多個線程要等待相同的鎖,源自併發性的改善微乎其微。太細,則流程太過複雜。
  21. 讀寫鎖:擁有更高的並行性。多個線程可以同時擁有讀模式讀寫鎖,只有一個線程擁有寫模式讀寫鎖。
  22. 讀寫鎖的相互關係:讀加鎖時,可以在對其加讀鎖;寫加鎖是,不可以加任何鎖;如果是讀加鎖,這個時候寫加鎖,那麼寫鎖會阻塞,並且期間不可以再加讀鎖。
  23. 初始化和銷燬函數:ptread_rwlock_init和ptread_rwlock_destroy。
  24. 相關函數:ptread_rwlock_rdlock,ptread_rwlock_wrlock,ptread_rwlock_unlock,ptread_rwlock_tryrdlock,ptread_rwlock_trywrlock。
  25. 條件變量:需要和互斥量配合一起使用。知道條件滿足纔會返回。函數爲:ptread_cond系列。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章