這篇文章主要講解了“C++多線程編程之如何解決多線程數據共享問題”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++多線程編程之如何解決多線程數據共享問題”吧!

創新互聯是專業的青銅峽網站建設公司,青銅峽接單;提供成都網站制作、成都做網站、外貿營銷網站建設,網頁設計,網站設計,建網站,PHP網站建設等專業做網站服務;采用PHP框架,可快速的進行青銅峽網站開發網頁制作和功能擴展;專業做搜索引擎喜愛的網站,專業的做網站團隊,希望更多企業前來合作!
通過容器創建多個線程
#include <vector> #include <iostream> #include <thread> void printTest(int num) { std::cout << "子線程:" << num << "啟動" << std::endl; std::cout << "子線程:" << num << "結束" << std::endl; } int main() { std::vector<std::thread* > test; for (int i = 0; i < 10; i++) { test.push_back(new std::thread(printTest, i)); } for (auto& pmove : test) { pmove->join(); } std::cout << "主線程" << std::endl; return 0; }數據共享問題分析只讀數據:穩定安全,不需要特殊處理,直接讀即可
#include <vector> #include <iostream> #include <thread> std::vector<int> g_data={ 1,2,3 }; void printTest(int num) { std::cout << "子線程:" << num << "讀操作" << std::endl; for (auto pmove : g_data) { std::cout << pmove << std::endl; } } int main() { std::vector<std::thread* > test; for (int i = 0; i < 10; i++) { test.push_back(new std::thread(printTest, i)); } for (auto& pmove : test) { pmove->join(); } std::cout << "主線程" << std::endl; return 0; }有讀有寫:需要做特別處理(寫只做寫,讀只做讀操作,保持共享數據只有唯一操作),不然會引發崩潰
#include <list> #include <iostream> #include <thread> class SeaKing { public: void makeFriend() { for (int i = 0; i < 100000; i++) { std::cout << "增加一個" << std::endl; mm.push_back(i); } } void breakUp() { for (int i = 0; i < 100000; i++) { if (!mm.empty()) { std::cout << "減少一個:"<<mm.front() << std::endl; mm.pop_front(); } else { std::cout << "已空" << std::endl; } } } protected: std::list<int> mm; }; int main() { SeaKing man; std::thread t1(&SeaKing::makeFriend, &man); std::thread t2(&SeaKing::breakUp, &man); t1.join(); t2.join(); return 0; } //以上程序會異常退出加鎖的方式解決數據共享問題互斥量mutex: 互斥量可以理解為鎖,他是一個mutex類的對象通過調用成員函數lock函數進行加鎖通過調用成員函數unlock函數進行解鎖
#include <list> #include <iostream> #include <thread> #include <mutex> //1.包含頭文件 class SeaKing { public: void makeFriend() { for (int i = 0; i < 100000; i++) { m_mutex.lock(); std::cout << "增加一個" << std::endl; mm.push_back(i); m_mutex.unlock(); } } bool readInfo() { m_mutex.lock(); //2.加鎖 if (!mm.empty()) { std::cout << "減少一個:" << mm.front() << std::endl; mm.pop_front(); m_mutex.unlock(); return true; } m_mutex.unlock(); return false; } void breakUp() { for (int i = 0; i < 100000; i++) { int result = readInfo(); if (result == false) { std::cout << "已空" << std::endl; } } } protected: std::list<int> mm; std::mutex m_mutex; //創建互斥量對象 }; int main() { SeaKing man; std::thread t1(&SeaKing::makeFriend, &man); std::thread t2(&SeaKing::breakUp, &man); t1.join(); t2.join(); return 0; }注意:lock函數與unlock都是成對出現,如果lock了沒有調用unlock會引發異常,abort終止程序通過lock_guard加鎖。
#include <list> #include <iostream> #include <thread> #include <mutex> class SeaKing { public: void makeFriend() { std::lock_guard<std::mutex> sbguard(m_mutex); for (int i = 0; i < 100000; i++) { std::cout << "增加一個" << std::endl; mm.push_back(i); } } bool readInfo() { std::lock_guard<std::mutex> sbguard(m_mutex); if (!mm.empty()) { std::cout << "減少一個:" << mm.front() << std::endl; mm.pop_front(); return true; } return false; } void breakUp() { for (int i = 0; i < 100000; i++) { int result = readInfo(); if (result == false) { std::cout << "已空" << std::endl; } } } protected: std::list<int> mm; std::mutex m_mutex; }; int main() { SeaKing man; std::thread t1(&SeaKing::makeFriend, &man); std::thread t2(&SeaKing::breakUp, &man); t1.join(); t2.join(); return 0; }其實lock_guard 在構造函數中進行lock,在析構函數中進行unlock,本質上還是lock與unlock操作。
感謝各位的閱讀,以上就是“C++多線程編程之如何解決多線程數據共享問題”的內容了,經過本文的學習后,相信大家對C++多線程編程之如何解決多線程數據共享問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創新互聯,小編將為大家推送更多相關知識點的文章,歡迎關注!
網頁題目:C++多線程編程之如何解決多線程數據共享問題
文章起源:http://www.yijiale78.com/article22/ghdecc.html
成都網站建設公司_創新互聯,為您提供ChatGPT、建站公司、營銷型網站建設、全網營銷推廣、商城網站、App開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯