成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++多線程編程之創建線程篇

開發 后端
多線程是程序員必須掌握的一門技術,本文主要是針對于C++新標準中多線程庫,需要具備一定C++基礎方可學習。

[[383623]]

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


前言

本章節主要C++多線程編程中的一些基本概念以及幾種創建線程的方式。

并發、進程、線程的基本概念

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

進程計算機中的程序關于某數據集合上的一次運行活動

進程特性

  1. 動態性:進程是程序的一次執行過程,是臨時的,有生命期,是動態產生,動態消亡的;
  2. 并發性:任何進程都可以同其他進行一起并發執行;
  3. 獨立性:進程是系統進行資源分配和調度的一個獨立單位;
  4. 結構性:進程由程序,數據和進程控制塊三部分組成

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

并發實現方案

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

同一電腦上可通過管道,文件,消息隊列,共享內存等方式實現

不同電腦可通過socket網絡通信實現

多個進程實現并發

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

C++線程編程基本操作

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

  1. #include <thread> 
  2. #include <iostream> 

2.創建線程: thread類創建一個線程

  1. #include <thread> 
  2. void print() 
  3.  std::cout<<"子線程"<<endl;     
  4. int main() 
  5.     //運行程序會調用abort函數終止程序     
  6.     std::thread t1(print);    
  7.     std::cout<<"主線程"<<std::endl; 

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

  1. #include <thread> 
  2. void print() 
  3.  std::cout<<"子線程"<<endl;     
  4. int main() 
  5.     std::thread t1(print);    
  6.     t1.join();      //阻塞主線程,等待子線程執行結束 
  7.     std::cout<<"主線程"<<std::endl; 
  8.     return 0; 

 4.detach:分離,剝離依附關系,駐留后臺

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

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

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

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

其他創建線程方法

1.用類和對象

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

2.Lambda表達式

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

3.帶引用參數創建方式

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

4.帶智能指針參數創建方式

  1. #include <thread> 
  2. #include <iostream> 
  3. #include <thread> 
  4. void printInfo(std::unique_ptr<int> ptr)  
  5.  std::cout << "子線程:"<<ptr.get() << std::endl; 
  6. int main()  
  7.  std::unique_ptr<int> ptr(new int(100)); 
  8.  std::cout << "主線程:" << ptr.get() << std::endl;   
  9.  std::thread t(printInfo,std::move(ptr));     
  10.  t.join(); 
  11.  std::cout << "主線程:"<<ptr.get() << std::endl;  //主線程:00000000 move掉了 
  12.  return 0; 

5.類的成員函數

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

好了,創建線程就介紹到這里,大家可以先練習一下,下章節講解共享數據訪問。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-03-05 07:38:52

C++線程編程開發技術

2012-05-18 10:36:20

CC++編程

2021-12-14 08:28:08

Java多線程線程

2021-12-26 18:22:30

Java線程多線程

2023-06-06 08:17:52

多線程編程Thread類

2013-06-07 16:30:08

iOS多線程iOS開發NSThread

2013-07-16 13:39:11

2010-01-18 14:09:58

C++多線程

2010-02-04 10:19:39

C++多線程

2010-02-05 15:30:54

C++多線程測試

2009-03-12 10:52:43

Java線程多線程

2024-02-02 18:29:54

C++線程編程

2010-01-21 11:25:44

linux多線程線程資源

2013-07-16 10:12:14

iOS多線程多線程概念多線程入門

2023-06-16 08:36:25

多線程編程數據競爭

2021-12-28 09:10:55

Java線程狀態

2009-06-17 11:23:00

Java多線程

2023-06-13 13:39:00

多線程異步編程

2023-06-07 13:49:00

多線程編程C#

2011-06-22 16:08:40

Qt 多線程 事件循環
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 夜夜久久| 亚洲精品4 | 日韩高清一区 | 91视频在线 | 超碰伊人久久 | 亚洲视频二 | 视频一区二区在线观看 | 日韩精品一区二区三区在线播放 | 日韩av一区二区在线观看 | 精品日韩一区二区 | 久久国产成人 | 日韩精品一区二区三区 | 久久蜜桃精品 | 免费黄色成人 | 亚洲视频在线一区 | 日韩欧美二区 | 狠狠爱免费视频 | 国产免费av在线 | 自拍偷拍欧美 | 狠狠艹| 草久在线视频 | 精品一二 | 国产精品成av人在线视午夜片 | 女人av | 欧美高清视频 | 成年人黄色一级毛片 | 精品一区二区三区不卡 | 中文字幕人成乱码在线观看 | 久久久久久99 | 色网站在线免费观看 | 激情 婷婷| 日韩国产欧美一区 | 亚洲免费网址 | 999国产精品视频免费 | 91精品国产综合久久久亚洲 | 婷婷色国产偷v国产偷v小说 | 精品成人一区二区 | 久草成人 | av黄色在线观看 | 久久久久久蜜桃一区二区 | 91国内精品久久 |