04C++11多執行緒程式設計之建立多個執行緒和資料共享問題分析
阿新 • • 發佈:2021-01-01
技術標籤:C++11多執行緒程式設計多執行緒
04C++11多執行緒程式設計之建立多個執行緒和資料共享問題分析
1 thread迴圈建立多個子執行緒
思想就是使用容器建立多個執行緒,推薦,以後工作中會使用到,具有實際意義,方便統一管理執行緒。
#include<iostream>
#include<thread>
#include<string>
#include<vector>
using namespace std;
void MyPrint(int i) {
cout << "my tid = " << this_thread::get_id() << endl;
}
int main(){
//使用容器建立多個執行緒,推薦,以後工作中會使用到,具有實際意義,方便統一管理執行緒
vector<thread> vTh;
for (auto i = 0; i < 10; i++) {
vTh.push_back(thread(MyPrint, i));
}
for (auto vit = vTh.begin(); vit != vTh.end(); vit++) {
if (vit->joinable()) {
vit- >join();
}
}
cout << "回收子執行緒完成" << endl;
return 0;
}
結果如下,混亂是因為執行緒競爭CPU時間分片的原因。
2 資料共享問題分析
這個很簡單,我就不使用程式碼分析了。注:共享都是指多執行緒下。
1)只讀:不需要做任何處理,都是安全的。
2)有讀有寫:必須加鎖或者其它同步處理,使其安全的訪問。否則輕則資料讀取的值未知,重則程式崩潰。例如普通全域性變數的值未保護,多個執行緒訪問的時候就會可能出現負很大的數;或者是全域性vector容器,不作保護並且有刪除元素或者push,pop等操作,其它執行緒此時同樣訪問該迭代器都會可能出現崩潰,特別是刪除。具體可以看我STL容器的文章看。
但是說很簡單,保護起來就非常的困難了。需要大量的工作經驗積累。