91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++多線程編程之如何解決多線程數據共享問題

發布時間:2021-10-18 11:09:17 來源:億速云 閱讀:230 作者:iii 欄目:編程語言

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

通過容器創建多個線程

#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++多線程編程之如何解決多線程數據共享問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

嵊州市| 张家川| 洪湖市| 建湖县| 乐陵市| 商河县| 定兴县| 子长县| 天峨县| 瓦房店市| 温宿县| 杨浦区| 昌图县| 独山县| 临朐县| 金平| 勃利县| 新野县| 巴中市| 噶尔县| 陵水| 石家庄市| 威海市| 涟源市| 襄樊市| 蒙山县| 洞口县| 通辽市| 和政县| 竹溪县| 天镇县| 潞西市| 驻马店市| 阿鲁科尔沁旗| 突泉县| 彭山县| 佳木斯市| 遵义县| 睢宁县| 项城市| 丰原市|