C 线程的使用~(下)
2.3 detach()
detach()?函數的作用是進行線程分離,分離主線程和創建出的子線程。在線程分離之后,主線程退出也會一并銷毀創建出的所有子線程,在主線程退出之前,它可以脫離主線程繼續獨立的運行,任務執行完畢之后,這個子線程會自動釋放自己占用的系統資源。(其實就是孩子翅膀硬了,和家里斷絕關系,自己外出闖蕩了,如果家里被誅九族還是會受牽連)。該函數函數原型如下:
void?detach();線程分離函數沒有參數也沒有返回值,只需要在線程成功之后,通過線程對象調用該函數即可,繼續將上面的測試程序修改一下:
int?main() {cout?<<?"主線程的線程ID:?"?<<?this_thread::get_id()?<<?endl;thread?t(func,?520,?"i?love?you");thread?t1(func1);cout?<<?"線程t?的線程ID:?"?<<?t.get_id()?<<?endl;cout?<<?"線程t1的線程ID:?"?<<?t1.get_id()?<<?endl;t.detach();t1.detach();//?讓主線程休眠,?等待子線程執行完畢this_thread::sleep_for(chrono::seconds(5)); }注意事項:線程分離函數?detach ()?不會阻塞線程,子線程和主線程分離之后,在主線程中就不能再對這個子線程做任何控制了,比如:通過?join ()?阻塞主線程等待子線程中的任務執行完畢,或者調用?get_id ()?獲取子線程的線程 ID。有利就有弊,魚和熊掌不可兼得,建議使用?join ()。
2.5 joinable()
joinable()?函數用于判斷主線程和子線程是否處理關聯(連接)狀態,一般情況下,二者之間的關系處于關聯狀態,該函數返回一個布爾類型:
返回值為 true:主線程和子線程之間有關聯(連接)關系
返回值為 false:主線程和子線程之間沒有關聯(連接)關系
示例代碼如下:
#include? #include? #include? using?namespace?std;void?foo() {this_thread::sleep_for(std::chrono::seconds(1)); }int?main() {thread?t;cout?<<?"before?starting,?joinable:?"?<<?t.joinable()?<<?endl;t?=?thread(foo);cout?<<?"after?starting,?joinable:?"?<<?t.joinable()?<<?endl;t.join();cout?<<?"after?joining,?joinable:?"?<<?t.joinable()?<<?endl;thread?t1(foo);cout?<<?"after?starting,?joinable:?"?<<?t1.joinable()?<<?endl;t1.detach();cout?<<?"after?detaching,?joinable:?"?<<?t1.joinable()?<<?endl; }示例代碼打印的結果如下:
before?starting,?joinable:?0 after?starting,?joinable:?1 after?joining,?joinable:?0 after?starting,?joinable:?1 after?detaching,?joinable:?0基于示例代碼打印的結果可以得到以下結論:
在創建的子線程對象的時候,如果沒有指定任務函數,那么子線程不會啟動,主線程和這個子線程也不會進行連接
在創建的子線程對象的時候,如果指定了任務函數,子線程啟動并執行任務,主線程和這個子線程自動連接成功
子線程調用了detach()函數之后,父子線程分離,同時二者的連接斷開,調用joinable()返回false
在子線程調用了join()函數,子線程中的任務函數繼續執行,直到任務處理完畢,這時join()會清理(回收)當前子線程的相關資源,所以這個子線程和主線程的連接也就斷開了,因此,調用join()之后再調用joinable()會返回false。
2.6 operator=
線程中的資源是不能被復制的,因此通過 = 操作符進行賦值操作最終并不會得到兩個完全相同的對象。
//?move?(1)? thread&?operator=?(thread&&?other)?noexcept; //?copy?[deleted]?(2)? thread&?operator=?(const?other&)?=?delete;通過以上 = 操作符的重載聲明可以得知:
如果 other 是一個右值,會進行資源所有權的轉移
如果 other 不是右值,禁止拷貝,該函數被顯示刪除(=delete),不可用
3. 靜態函數
thread 線程類還提供了一個靜態方法,用于獲取當前計算機的 CPU 核心數,根據這個結果在程序中創建出數量相等的線程,每個線程獨自占有一個 CPU 核心,這些線程就不用分時復用 CPU 時間片,此時程序的并發效率是最高的。
static?unsigned?hardware_concurrency()?noexcept;示例代碼如下:
#include? #include? using?namespace?std;int?main() {int?num?=?thread::hardware_concurrency();cout?<<?"CPU?number:?"?<<?num?<<?endl; }4. C 線程庫
C 語言提供的線程庫不論在 window 還是 Linux 操作系統中都是可以使用的,看明白了這些 C 語言中的線程函數之后會發現它和上面的 C 線程類使用很類似(其實就是基于面向對象的思想進行了封裝),但 C 的線程類用起來更簡單一些,鏈接奉上,感興趣的可以一看。
聲明:
本文于網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。
總結
以上是生活随笔為你收集整理的C 线程的使用~(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新电脑系统不兼容软件(电脑系统与软件不兼
- 下一篇: 7个华为关于C语言的经典面试题