日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
C++多線程編程之多線程數(shù)據(jù)共享問題

 通過容器創(chuàng)建多個(gè)線程

紅塔網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)從2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

 
 
 
  1. #include  
  2. #include  
  3. #include  
  4. void printTest(int num)  
  5.     std::cout << "子線程:" << num << "啟動(dòng)" << std::endl; 
  6.     std::cout << "子線程:" << num << "結(jié)束" << std::endl; 
  7. int main()  
  8.     std::vector test; 
  9.     for (int i = 0; i < 10; i++)  
  10.     { 
  11.         test.push_back(new std::thread(printTest, i)); 
  12.     } 
  13.     for (auto& pmove : test) 
  14.     { 
  15.         pmove->join(); 
  16.     } 
  17.     std::cout << "主線程" << std::endl; 
  18.     return 0; 

 數(shù)據(jù)共享問題分析只讀數(shù)據(jù):穩(wěn)定安全,不需要特殊處理,直接讀即可

 
 
 
  1. #include  
  2. #include  
  3. #include  
  4. std::vector g_data={ 1,2,3 }; 
  5. void printTest(int num)  
  6.  std::cout << "子線程:" << num << "讀操作" << std::endl; 
  7.  for (auto pmove : g_data)  
  8.  { 
  9.  std::cout << pmove << std::endl; 
  10.  } 
  11. int main()  
  12.  std::vector test; 
  13.  for (int i = 0; i < 10; i++)  
  14.  { 
  15.  test.push_back(new std::thread(printTest, i)); 
  16.  } 
  17.  for (auto& pmove : test) 
  18.  { 
  19.  pmove->join(); 
  20.  } 
  21.  std::cout << "主線程" << std::endl; 
  22.  return 0; 

 有讀有寫:需要做特別處理(寫只做寫,讀只做讀操作,保持共享數(shù)據(jù)只有唯一操作),不然會(huì)引發(fā)崩潰

 
 
 
  1. #include  
  2. #include  
  3. #include  
  4. class SeaKing  
  5. public: 
  6.  void makeFriend() 
  7.  { 
  8.  for (int i = 0; i < 100000; i++)  
  9.  { 
  10.  std::cout << "增加一個(gè)" << std::endl; 
  11.  mm.push_back(i); 
  12.  } 
  13.  } 
  14.  void breakUp()  
  15.  { 
  16.  for (int i = 0; i < 100000; i++)  
  17.  { 
  18.  if (!mm.empty())  
  19.  { 
  20.  std::cout << "減少一個(gè):"<
  21.  mm.pop_front(); 
  22.  } 
  23.  else  
  24.  { 
  25.  std::cout << "已空" << std::endl; 
  26.  } 
  27.  } 
  28.  } 
  29. protected: 
  30.  std::list mm; 
  31. }; 
  32. int main()  
  33.  SeaKing man; 
  34.  std::thread t1(&SeaKing::makeFriend, &man); 
  35.  std::thread t2(&SeaKing::breakUp, &man); 
  36.  t1.join(); 
  37.  t2.join(); 
  38.  return 0; 
  39. //以上程序會(huì)異常退出 

 加鎖的方式解決數(shù)據(jù)共享問題互斥量mutex: 互斥量可以理解為鎖,他是一個(gè)mutex類的對(duì)象通過調(diào)用成員函數(shù)lock函數(shù)進(jìn)行加鎖通過調(diào)用成員函數(shù)unlock函數(shù)進(jìn)行解鎖

 
 
 
  1. #include  
  2. #include  
  3. #include  
  4. #include  //1.包含頭文件 
  5. class SeaKing  
  6. public: 
  7.  void makeFriend() 
  8.  { 
  9.  for (int i = 0; i < 100000; i++)  
  10.  { 
  11.  m_mutex.lock(); 
  12.  std::cout << "增加一個(gè)" << std::endl; 
  13.  mm.push_back(i); 
  14.  m_mutex.unlock(); 
  15.  } 
  16.  } 
  17.  bool readInfo()  
  18.  { 
  19.  m_mutex.lock(); //2.加鎖 
  20.  if (!mm.empty()) 
  21.  { 
  22.  std::cout << "減少一個(gè):" << mm.front() << std::endl; 
  23.  mm.pop_front(); 
  24.  m_mutex.unlock(); 
  25.  return true; 
  26.  } 
  27.  m_mutex.unlock(); 
  28.  return false; 
  29.  } 
  30.  void breakUp()  
  31.  { 
  32.  for (int i = 0; i < 100000; i++) 
  33.  { 
  34.  int result = readInfo(); 
  35.  if (result == false)  
  36.  { 
  37.  std::cout << "已空" << std::endl; 
  38.  } 
  39.  } 
  40.  } 
  41. protected: 
  42.  std::list mm; 
  43.  std::mutex m_mutex; //創(chuàng)建互斥量對(duì)象 
  44. }; 
  45. int main()  
  46.  SeaKing man; 
  47.  std::thread t1(&SeaKing::makeFriend, &man); 
  48.  std::thread t2(&SeaKing::breakUp, &man); 
  49.  t1.join(); 
  50.  t2.join(); 
  51.  return 0; 

 注意:lock函數(shù)與unlock都是成對(duì)出現(xiàn),如果lock了沒有調(diào)用unlock會(huì)引發(fā)異常,abort終止程序通過lock_guard加鎖。

 
 
 
  1. #include  
  2. #include  
  3. #include  
  4. #include  
  5. class SeaKing  
  6. public: 
  7.     void makeFriend() 
  8.     { 
  9.         std::lock_guard sbguard(m_mutex); 
  10.         for (int i = 0; i < 100000; i++)  
  11.         { 
  12.             std::cout << "增加一個(gè)" << std::endl; 
  13.             mm.push_back(i); 
  14.         } 
  15.     } 
  16.     bool readInfo()  
  17.     { 
  18.         std::lock_guard sbguard(m_mutex); 
  19.         if (!mm.empty()) 
  20.         { 
  21.             std::cout << "減少一個(gè):" << mm.front() << std::endl; 
  22.             mm.pop_front(); 
  23.             return true; 
  24.         } 
  25.         return false; 
  26.     } 
  27.     void breakUp()  
  28.     { 
  29.         for (int i = 0; i < 100000; i++) 
  30.         { 
  31.             int result = readInfo(); 
  32.             if (result == false)  
  33.             { 
  34.                 std::cout << "已空" << std::endl; 
  35.             } 
  36.         } 
  37.     } 
  38. protected: 
  39.     std::list mm; 
  40.     std::mutex m_mutex; 
  41. }; 
  42. int main()  
  43.     SeaKing man; 
  44.     std::thread t1(&SeaKing::makeFriend, &man); 
  45.     std::thread t2(&SeaKing::breakUp, &man); 
  46.     t1.join(); 
  47.     t2.join(); 
  48.     return 0; 

 其實(shí)lock_guard 在構(gòu)造函數(shù)中進(jìn)行l(wèi)ock,在析構(gòu)函數(shù)中進(jìn)行unlock,本質(zhì)上還是lock與unlock操作。


新聞名稱:C++多線程編程之多線程數(shù)據(jù)共享問題
URL標(biāo)題:http://www.dlmjj.cn/article/dphjgps.html