這裏僅僅是單純的總結一下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類的使用