您好,登錄后才能下訂單哦!
C++中怎么創建線,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
并發、進程、線程的基本概念
并發兩個或者多個任務(獨立的活動)同時發生(進行):一個程序通知執行多個獨立的任務并發假象(不是真正的并發):單核CPU通過上下文切換方式實現進程
進程計算機中的程序關于某數據集合上的一次運行活動
進程特性
鴻蒙官方戰略合作共建——HarmonyOS技術社區
動態性:進程是程序的一次執行過程,是臨時的,有生命期,是動態產生,動態消亡的;
并發性:任何進程都可以同其他進行一起并發執行;
獨立性:進程是系統進行資源分配和調度的一個獨立單位;
結構性:進程由程序,數據和進程控制塊三部分組成
線程每個進程都有一個主線程并且主線程是唯一的,也就是一個進程只能有一個主線程。vs編譯器中ctr+f5編譯運行程序時,實際是主線程調用mian函數中的代碼。線程可以理解為代碼執行通道,除了主線程之外,可以自己創建其他線程。
并發實現方案
主要解決是進程間通信問題
同一電腦上可通過管道,文件,消息隊列,共享內存等方式實現
不同電腦可通過socket網絡通信實現
多個進程實現并發
單獨進程,多個線程實現并發 即一個主線程,多個子線程實現并發一個進程中的所有線程共享內存空間(共享內存),例如全局變量,指針引用等,所以多線程開銷遠遠小于多進程。共享內存也會導致數據一致性問題(資源競爭問題)。
C++線程編程基本操作
1.首先需要包含thread頭文件
#include <thread> #include <iostream>
2.創建線程: thread類創建一個線程
#include <thread> void print() { std::cout<<"子線程"<<endl; } int main() { //運行程序會調用abort函數終止程序 std::thread t1(print); std::cout<<"主線程"<<std::endl; }
3.join:加入/匯合線程。阻塞主線程,等待子線程執行結束,可理解為依附功能
#include <thread> void print() { std::cout<<"子線程"<<endl; } int main() { std::thread t1(print); t1.join(); //阻塞主線程,等待子線程執行結束 std::cout<<"主線程"<<std::endl; return 0; }
4.detach:分離,剝離依附關系,駐留后臺
#include <thread> #include <iostream> #include <windows.h> void print() { for (int i = 0; i < 10; i++) { std::cout << "子線程"<<i << std::endl; } } int main() { std::thread t1(print); std::cout << "主線程" << std::endl; //可用Sleep延時實現結果演示 t1.detach(); return 0; }
注意:一旦detach線程后,便不可再使用join線程。
5.joinable:判斷當前線程是否可以join或deatch,如果可以返回true,不能返回false
#include <thread> #include <iostream> void print() { for (int i = 0; i < 10; i++) { std::cout << "子線程"<<i << std::endl; } } int main() { std::thread t1(print); t1.detach(); if (t1.joinable()) { t1.join(); std::cout << "可join" << std::endl; } std::cout << "主線程" << std::endl; return 0; }
其他創建線程方法
1.用類和對象
#include <thread> #include <iostream> class Function { public: void operator()() { std::cout << "子線程" << std::endl; } }; int main() { Function object; std::thread t1(object); //可調用對象即可 t1.join(); std::thread t2((Function())); t2.join(); std::cout << "主線程" << std::endl; return 0; }
2.Lambda表達式
#include <thread> #include <iostream> int main() { std::thread t1([] {std::cout << "子線程" << std::endl; }); t1.join(); std::cout << "主線程" << std::endl; return 0; }
3.帶引用參數創建方式
#include <thread> #include <iostream> #include <thread> void printInfo(int& num) { num = 1001; std::cout << "子進程:"<<num << std::endl; } int main() { int num = 0; //std::ref 用于包裝按引用傳遞的值。 //std::cref 用于包裝按const引用傳遞的值 //error C2672: “invoke”: 未找到匹配的重載函數 std::thread t(printInfo, std::ref(num)); t.join(); std::cout << "主線程:"<<num << std::endl; return 0; }
4.帶智能指針參數創建方式
#include <thread> #include <iostream> #include <thread> void printInfo(std::unique_ptr<int> ptr) { std::cout << "子線程:"<<ptr.get() << std::endl; } int main() { std::unique_ptr<int> ptr(new int(100)); std::cout << "主線程:" << ptr.get() << std::endl; std::thread t(printInfo,std::move(ptr)); t.join(); std::cout << "主線程:"<<ptr.get() << std::endl; //主線程:00000000 move掉了 return 0; }
5.類的成員函數
#include <thread> #include <iostream> #include <thread> class MM { public: void print(int& num) { num = 1001; std::cout << "子線程:"<<num << std::endl; } }; int main() { MM mm; int num = 10; std::thread t(&MM::print,mm,std::ref(num)); t.join(); std::cout << "主線程:"<< num << std::endl; return 0; }
關于C++中怎么創建線問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。