日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++多線程編程之創(chuàng)建線程篇

 多線程是程序員必須掌握的一門技術(shù),本文主要是針對于C++新標準中多線程庫,需要具備一定C++基礎(chǔ)方可學(xué)習(xí)。

10余年的烏拉特后網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整烏拉特后建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“烏拉特后網(wǎng)站設(shè)計”,“烏拉特后網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

前言

本章節(jié)主要C++多線程編程中的一些基本概念以及幾種創(chuàng)建線程的方式。

并發(fā)、進程、線程的基本概念

并發(fā)兩個或者多個任務(wù)(獨立的活動)同時發(fā)生(進行):一個程序通知執(zhí)行多個獨立的任務(wù)并發(fā)假象(不是真正的并發(fā)):單核CPU通過上下文切換方式實現(xiàn)進程

進程計算機中的程序關(guān)于某數(shù)據(jù)集合上的一次運行活動

進程特性

  1. 動態(tài)性:進程是程序的一次執(zhí)行過程,是臨時的,有生命期,是動態(tài)產(chǎn)生,動態(tài)消亡的;
  2. 并發(fā)性:任何進程都可以同其他進行一起并發(fā)執(zhí)行;
  3. 獨立性:進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位;
  4. 結(jié)構(gòu)性:進程由程序,數(shù)據(jù)和進程控制塊三部分組成

線程每個進程都有一個主線程并且主線程是唯一的,也就是一個進程只能有一個主線程。vs編譯器中ctr+f5編譯運行程序時,實際是主線程調(diào)用mian函數(shù)中的代碼。線程可以理解為代碼執(zhí)行通道,除了主線程之外,可以自己創(chuàng)建其他線程。

并發(fā)實現(xiàn)方案

主要解決是進程間通信問題

同一電腦上可通過管道,文件,消息隊列,共享內(nèi)存等方式實現(xiàn)

不同電腦可通過socket網(wǎng)絡(luò)通信實現(xiàn)

多個進程實現(xiàn)并發(fā)

單獨進程,多個線程實現(xiàn)并發(fā) 即一個主線程,多個子線程實現(xiàn)并發(fā)一個進程中的所有線程共享內(nèi)存空間(共享內(nèi)存),例如全局變量,指針引用等,所以多線程開銷遠遠小于多進程。共享內(nèi)存也會導(dǎo)致數(shù)據(jù)一致性問題(資源競爭問題)。

C++線程編程基本操作

1.首先需要包含thread頭文件

 
 
 
 
  1. #include 
  2. #include 

2.創(chuàng)建線程: thread類創(chuàng)建一個線程

 
 
 
 
  1. #include 
  2. void print()
  3. {
  4.  std::cout<<"子線程"<
  5. }
  6. int main()
  7. {
  8.     //運行程序會調(diào)用abort函數(shù)終止程序    
  9.     std::thread t1(print);   
  10.     std::cout<<"主線程"<
  11. }

 3.join:加入/匯合線程。阻塞主線程,等待子線程執(zhí)行結(jié)束,可理解為依附功能

 
 
 
 
  1. #include 
  2. void print()
  3. {
  4.  std::cout<<"子線程"<
  5. }
  6. int main()
  7. {
  8.     std::thread t1(print);   
  9.     t1.join();      //阻塞主線程,等待子線程執(zhí)行結(jié)束
  10.     std::cout<<"主線程"<
  11.     return 0;
  12. }

 4.detach:分離,剝離依附關(guān)系,駐留后臺

 
 
 
 
  1. #include 
  2. #include 
  3. #include 
  4. void print() 
  5. {
  6.  for (int i = 0; i < 10; i++) 
  7.  {
  8.   std::cout << "子線程"<
  9.  }
  10. }
  11. int main() 
  12. {
  13.  std::thread t1(print);
  14.  std::cout << "主線程" << std::endl;
  15.     //可用Sleep延時實現(xiàn)結(jié)果演示
  16.  t1.detach();
  17.  return 0;
  18. }

注意:一旦detach線程后,便不可再使用join線程。

5.joinable:判斷當前線程是否可以join或deatch,如果可以返回true,不能返回false

 
 
 
 
  1. #include 
  2. #include 
  3. void print() 
  4. {
  5.  for (int i = 0; i < 10; i++) 
  6.  {
  7.   std::cout << "子線程"<
  8.  }
  9. }
  10. int main() 
  11. {
  12.  std::thread t1(print);
  13.  t1.detach();
  14.  if (t1.joinable()) 
  15.  {
  16.   t1.join();
  17.   std::cout << "可join" << std::endl;
  18.  }
  19.  std::cout << "主線程" << std::endl;
  20.  return 0;
  21. }

其他創(chuàng)建線程方法

1.用類和對象

 
 
 
 
  1. #include 
  2. #include 
  3. class Function 
  4. {
  5. public:
  6.  void operator()() 
  7. {
  8.   std::cout << "子線程" << std::endl;
  9.  }
  10. };
  11. int main() 
  12. {
  13.  Function object;
  14.  std::thread t1(object);    //可調(diào)用對象即可
  15.  t1.join();
  16.  std::thread t2((Function()));
  17.  t2.join();
  18.  std::cout << "主線程" << std::endl;
  19.  return 0;
  20. }

2.Lambda表達式

 
 
 
 
  1. #include 
  2. #include 
  3. int main() 
  4. {
  5.  std::thread t1([] {std::cout << "子線程" << std::endl; });
  6.  t1.join();
  7.  std::cout << "主線程" << std::endl;
  8.  return 0;
  9. }

3.帶引用參數(shù)創(chuàng)建方式

 
 
 
 
  1. #include 
  2. #include 
  3. #include 
  4. void printInfo(int& num) 
  5. {
  6.  num = 1001;
  7.  std::cout << "子進程:"<
  8. }
  9. int main() 
  10. {
  11.  int num = 0;
  12.  //std::ref 用于包裝按引用傳遞的值。
  13.  //std::cref 用于包裝按const引用傳遞的值
  14.  //error C2672: “invoke”: 未找到匹配的重載函數(shù)
  15.  std::thread t(printInfo, std::ref(num));    
  16.  t.join();
  17.  std::cout << "主線程:"<
  18.  return 0;
  19. }

4.帶智能指針參數(shù)創(chuàng)建方式

 
 
 
 
  1. #include 
  2. #include 
  3. #include 
  4. void printInfo(std::unique_ptr ptr) 
  5. {
  6.  std::cout << "子線程:"<
  7. }
  8. int main() 
  9. {
  10.  std::unique_ptr ptr(new int(100));
  11.  std::cout << "主線程:" << ptr.get() << std::endl;  
  12.  std::thread t(printInfo,std::move(ptr));    
  13.  t.join();
  14.  std::cout << "主線程:"<
  15.  return 0;
  16. }

5.類的成員函數(shù)

 
 
 
 
  1. #include 
  2. #include 
  3. #include 
  4. class MM 
  5. {
  6. public:
  7.  void print(int& num) 
  8. {
  9.   num = 1001;
  10.   std::cout << "子線程:"<
  11.  }
  12. };
  13. int main() 
  14. {
  15.  MM mm;
  16.  int num = 10;
  17.  std::thread t(&MM::print,mm,std::ref(num));    
  18.  t.join();
  19.  std::cout << "主線程:"<< num << std::endl;
  20.  return 0;
  21. }

好了,創(chuàng)建線程就介紹到這里,大家可以先練習(xí)一下,下章節(jié)講解共享數(shù)據(jù)訪問。


新聞名稱:C++多線程編程之創(chuàng)建線程篇
文章起源:http://www.5511xx.com/article/dhjcogo.html