c++ 學習之 多線程(三) thread類的成員函數
前言
thread類提供了幾個成員函數,由於構造函數之前有講過,所以本文着重分析一下其他函數的用法。
正文
1.~thread()
析構函數,用來銷燬thread對象,但是調用析構函數的前提必須是該thread對象是不可連接的,否則不可以。
2.joinable()
調用這個函數來判斷該thread對象是否可連接,可以返回真,否則返回假。
以下幾種是不可連接的:
*由默認構造函數創建的對象
*被移動過的對象
*調用過join()或detach()的對象
也就是一個執行着線程並且沒有調用過join()和detach()的線程就是可連接的。
我們通常在調用join()和detach()調用joinable來防止多次調用join()和detach().
注意,只有不可連接的thread對象纔可以通過調用析構函數來回收,否則將拋出異常。
3.join()
該函數起到加入等待的作用,調用該函數後,該函數將會在子線程結束後纔會返回,它在子線程結束之前,會阻塞在那裏,直到構造函數中的可調用對象(函數)結束後,函數返回。在調用這個函數後,thread對象將會不可連接,調用joinable()返回false。
我們通常在主線程結束之前調用這個函數來確保子線程在主線程之前執行完畢。
4.detach()
該函數用於線程分離,調用該函數後子線程與主線程分離,彼此獨立。兩個線程會繼續執行,並且不會相互影響,當任何一方結束後,該線程的資源都會被回收。調用完detach()後,對象變爲不可連接,可以被安全的析構。
我們通常調用這個函數來讓子線程從主線程中分離,以確保主線程的結束不受子線程的限制。但是這樣有一個弊端,就是當主線程結束後,資源被釋放,如果子線程中有使用主線程創建的實參,就會出現不可預料的事情(大概率崩潰,別問爲啥,問就是崩過,嗚嗚嗚)。
5.operator=
移動指定線程,=在thread類中被重載了。只有當對象不可連接的時候纔可以使用,調用後,獲得被移動對象的線程,被移動對象將不在執行任何線程。如果是可連接的,會拋出異常。注意,被移動的thread對象需要用std::move()轉換爲右值。
6.swap()
交換兩個thread對象。
7.get_id()
返回線程id。
8.native_handle()
返回線程句柄。
9.hardware_concurrency()
獲取硬件支持的併發線程數。正常返回支持的併發線程數,若值非良定義或不可計算,則返回 0。