創建線程
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密集型程序的用戶體驗。