關於C++中的多線程(三種創建線程的合集)

這裏僅僅是單純的總結一下C++中的多線程的實際使用方法

多線程

基本概念

多線程是多任務處理的一種特殊形式,多任務處理允許讓電腦同時運行兩個或兩個以上的程序。一般情況下,兩種類型的多任務處理:基於進程和基於線程。

  • 基於進程的多任務處理是程序的併發執行。
  • 基於線程的多任務處理是同一程序的片段的併發執行。
    多線程程序包含可以同時運行的兩個或多個部分,這樣的程序中的每個部分成爲一個線程,每個線程定義了一個單獨的執行路徑。

簡單實現(此處使用說明的是C++11中的std::thread)

成員類型和成員函數:
在這裏插入圖片描述
在這裏插入圖片描述
(1).默認構造函數,創建一個空的 thread 執行對象。
(2).初始化構造函數,創建一個 thread 對象,該 thread 對象可被 joinable,新產生的線程會調用 fn 函數,該函數的參數由 args 給出。
(3).拷貝構造函數(被禁用),意味着 thread 不可被拷貝構造。
(4).move 構造函數,move 構造函數,調用成功之後 x 不代表任何 thread 執行對象。
注意:可被 joinable 的 thread 對象必須在他們銷燬之前被主線程 join 或者將其設置爲 detached。

一些相關的構造函數及對應的存儲位置:

//棧上 
thread t1(show);   //根據函數初始化執行 
thread t2(show); 
thread t3(show); 
//線程數組 
thread th[3]{thread(show), thread(show), thread(show)};  
//堆上 
thread *pt1(new thread(show)); 
thread *pt2(new thread(show)); 
thread *pt3(new thread(show)); 
//線程指針數組 
thread *pth(new thread[3]{thread(show), thread(show), thread(show)});

線程初始化(如下實現了多線程傳遞參數)

void show(const char *str, const int id)int main() 
{ 
    thread t1(show, "hello!", 0);  //三個參數分別爲函數名,以及其兩個參數
    thread t2(show, "C++!", 1); 
    return 0; 
} 

join:調用該函數會阻塞當前線程。阻塞調用者(caller)所在的線程直至被join的std::thread對象標識的線程執行結束;

detach:將當前線程對象所代表的執行實例與該線程對象分離,使得線程的執行可以單獨進行。一旦線程執行完畢,它所分配的資源將會被釋放。

在任何一個時間點上,線程是可結合的(joinable),或者是分離的(detached)。一個可結合的線程能夠被其他線程收回其資源和殺死;在被其他線程回收之前,它的存儲器資源(如棧)是不釋放的。相反,一個分離的線程是不能被其他線程回收或殺死的,它的存儲器資源在它終止時由系統自動釋放。
threads.joinable() 判斷線程是否可以join ;threads.join();//主線程等待當前線程執行完成再退出 ;
th.detach();//脫離主線程的綁定,主線程掛了,子線程不報錯,子線程執行完自動退出。 //detach以後,子線程會成爲孤兒線程,線程之間將無法通信。

有時間會把關於C++多線程在整理學習一下,目前整理到此處;一下的參考鏈接有三種形式的線程開啓方式可供選擇,待時間稍微寬裕會一一做驗證。

參考鏈接:

1.https://www.cnblogs.com/codingmengmeng/p/5913068.html 該鏈接爲利用Windows系統爲我們提供的相關API來自己創建線程的API函數
2.https://www.runoob.com/cplusplus/cpp-multithreading.html
https://blog.csdn.net/hsd2012/article/details/50930236(該方法目前未做驗證)
這兩個鏈接爲使用 pthread.h 頭文件(該文件需下載配置) 來進行線程的創建
3.https://www.cnblogs.com/MCSFX/p/11226627.html
https://www.cnblogs.com/zhang-qc/p/8671248.html
https://blog.csdn.net/liuker888/article/details/46848905
https://blog.csdn.net/fengbingchun/article/details/73393229
該鏈接就是C++11原生存在的thread類的使用

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