Linux線程的簡單理解2

創建線程

pthread_create()
函數第一個參數執行一個虛擬內存單元,該內存單元的地址即爲新創建線程的線程ID,屬於NPTL線程庫的範疇。線程庫的後續操作,就是根據該線程的ID來操作線程的。

結束線程

1.讓線程入口函數執行結束。(主要使用的結束方式)與進程一樣
2.pthread_exit 讓本線程結束,pthread_exit 參數是一個void* 表示進程結束的返回值,很少用,一般參數爲NULL。終止自己。
3.pthread_cancel 讓任意一個線程結束。(本進程中的線程)讓新線程結束!終止同一個進程中的另一個線程。
4.kill任何一個進程,讓線程也就結束了

線程等待
爲什麼要線程等待?

  • 已經退出的線程,其空間沒有被釋放,仍然在進程的地址空間內
  • 創建新的線程不會複用剛纔退出線程的地址空間
pthread_join()
調用該函數的線程將掛起等待,知道id爲thread的線程終止。
目的和進程等待類似,防止出現類似殭屍進程的內存泄漏的情況

分離線程

  • 默認情況下,新創建的線程是需要進行回收的,線程退出後,需要對其進行pthread_join操作,否則無法釋放資源,從而造成系統泄漏。調用pthread_join的線程是要掛起等待的。
  • 如果不關心線程的返回值,join是一種負擔,這個時候,我們可用告訴系統,當線程退出時,自動釋放線程資源。
pthread_detach(pthread_self());
類似於忽略SIGCHLD信號,線程分離後,就不需要pthread_join來顯示回收了。

線程不是越多越好,達到一定程度,cpu已經全部達到上限之後,此時線程數如果繼續增多,非但不能提高效率,反而會降低效率(線程多了,調度開銷也就更大,效率也就會受到影響)

線程有幾個?先看是cpu密集型還是io密集型
到底搞幾個線程呢?線程數目和工作的任務類型有關,究竟有多少個合適,要通過測試的方法來判斷。

線程異常
單個線程如果出現除零,野指針問題導致線程崩潰,進程也會隨着崩潰。
線程是進程的執行分支,線程出現異常,就類似進程出現異常,進而觸發信號機制,終止進程,進程終止,該進程內的所有線程也就隨之退出。

線程用途
合理使用多線程,能夠提高CPU密集型程序的執行效率
合理使用多線程,能夠提高IO密集型程序的用戶體驗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章