日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++11新特性以及std::thread多线程编程

發布時間:2024/7/19 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++11新特性以及std::thread多线程编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 .C++11新特性

1. auto 類型推導
1.1 當=號右邊的表達式是一個引用類型時,auto會把引用拋棄,直接推導出原始類型;
1.2 當=號右邊的表達式帶有const屬性時,auto不會使用const屬性;
1.3 當const 和引用結合時,auto將保留表達式的const屬性;

2.auto使用限制
2.1 auto變量必須初始化;
2.2 auto不能在函數參數中使用;
2.3 auto不能用于類的非靜態成員變量;
2.4 auto不能定義數組;
2.5 auto不能作用于模板參數;
2.6 auto遍歷STL容器時,修改對象的值不會生效。

3.auto應用場景
3.1 auto用于定義STL中的迭代器;
3.2 auto用于泛型編程(模板類和模板函數等);

4.decltype關鍵字,與auto功能類似
4.1 decltype(exp) name = value

  • decltype根據表達式exp推導類型,根據表達式的返回類型,但不可以是void;

4.2 如果exp是一個左值,或被()包圍,那么decltype((exp))或decltype(n = a+b)的類型就是exp的引用;
4.3 如果exp是一個函數,decltype(exp)并不會執行函數代碼。

5.推導類的非靜態成員變量或函數返回值類型使用decltype;

template<typename T> class Base {private:decltype(T().begin()) m_iter; }

6.auto與decltype的區別
6.1 const與volatile,const表示只讀,而volatile表示數據易變,簡稱cv限定符;
6.2 auto可能會去掉cv限定符屬性,而decltype則會保留;

7.基于范圍的for循環
7.1 遍歷

for( auto value : myVector) {//注意:value為myVector中的元素,而不是下標... } map<string,string> Map; for(pair<string,string> value :Map) {//map采用pair來遍歷... }

7.2 不支持以指針形式返回的數組,只能遍歷有明確范圍的一組數據,當使用此方法遍歷容器時,對某些容器,在遍歷過程中動態添加元素會導致出錯。

8.基于右值引用的移動語義與完美轉發
8.1 通常將可位于賦值號(=)左側的表達式稱為左值,只能位于賦值號右側的表達式就是右值;
8.2 左值可以作為右值;
8.3 可獲取到存儲地址的表達式即為左值;
8.4 &只能操作左值,無法添加右值引用,右值引用采用&&來表示;

  • 右值引用必須立即進行初始化,且只能使用右值進行初始化;
int&& a = 10//右值引用可修改,a = 100;

9.移動語義
9.1 用一個對象初始化一個同類對象 -> 復制構造函數;
9.2 移動構造函數,使用右值引用的形式作為函數參數;
9.3 默認情況下,左值初始化同類對象只會調用拷貝構造函數完成,如果想要調用移動構造函數,則必須使用右值進行初始化,為滿足這個需求,引入了std::move函數,它可以將左值強制轉化為對應的右值,因此而調用移動構造函數;

//移動構造函數寫法 Student(Student && stu) {... } Student stu; Student s1 = stu; Student s2 = std::move(stu);

10.完美轉發
10.1 在函數模板中實現參數的完美轉發;
10.2 將自己的參數完美的轉發給內部調用的其他函數,所謂完美,即不僅能準確的轉發參數的值,還能保證被轉發的參數的左、右值屬性不變;

  • 很多場景是否實現完美轉發,直接決定了該參數的傳遞過程是使用拷貝語義還是移動語義

  • 注意:函數模板,使用右值引用定義參數,是一種萬能引用,既可以接收右值,也可以接收左值。

template<typename T> void function(T&& t) {otherdef(t); } //=>折疊引用規則
  • 解決了無論傳入的是左值,還是右值,如何在函數內部連同其左,右屬性都傳入,引入了forword<T>(){forword<T>()}forword<T>();
template<typename T> void function(T&& t) {otherdef(forword<T>(t));//維護t的左、右屬性,實現完美轉發。 }

11.nullptr關鍵字
替代NULL,0等指針復制;

12.智能指針
12.1 share_ptr

#include<memory> using namespace std; std::shared_ptr<int> ptr;//引用計數為1; std::shared_ptr<int> ptr(nullprt);//引用計數為0//初始化 std::make_shared<T>,有提供拷貝和移動構造函數,同一個普通指針不能為多個shared_ptr賦值;//自定義釋放規則 std::shared_ptr<int> ptr<new int[10],std::default_delete<int[]>());

12.2 unique_ptr

  • 每個unique_ptr指針都獨自擁有對其所指堆棧內存空間的所有權,與shared_ptr不同;
  • 只提供移動構造函數;
  • 自定義釋放規則;

12.3 weak_ptr

  • 配合shared_ptr使用,不會使引用計數加1或減1,單獨使用無意義。

二.std::thread多線程使用心得

1.static_cast ,在編譯時進行類型檢查,而對于強制轉換則不會進行類型檢查;

  • 用于基類,子類之間的轉換;

2.std::thread_hardware_concurrency(),獲取cpu硬件支持的并發數;

3.實現多線程讀取文件,每個線程對應一個文件,對多個文件的數據源進行讀取,結果匯總。
以下文作者實踐后編寫的多線程基本框架。

//MultiThread.h及其.cpp文件 #include<queue> #include <map> #include<mutex> #include<thread> #include<string>class FileNode { public//每個線程執行的函數,主要復則讀取file文件,CurrentThreadNumber用于指示當前還沒有分配的線程數量,FileNumber指示還有多少文件沒有處理,具體實現需要借助m_mutex處理數據,保證m_FileMapData,CurrentThreadNumber,FileNumber數據正確void ReadFile(std::string filepath,unsigned int& CurrentThreadNumber,unsigned int& FileNumber);//初始化隊列void InitQuque(std::string dir);bool IsQueueEmpty(); //判斷隊列是否為空,具體實現需要借助m_mutex處理數據,保證數據正確bool GetQueueData(std::string file);//獲取隊列中的數據,具體實現需要借助m_mutex處理數據,保證數據正確bool GetQueueSize(); //獲取文件總數 private:std::mutex m_mutex; //互斥信號量,用于m_FileQueue和m_FileMapData的線程互斥操作std::queue<std::string> m_FileQueue; //文件處理隊列std::map<std::string file,std::string data> m_FileMapData; //數據匯總 };class MultiThread { publicvoid RunMultiThread(unsigned int count,std::string dir);//指定運行的線程數量,dir文需要處理的目錄 private:FileNode m_Data; };void MultiThread::RunMultiThread(unsigned int count,std::string dir) {unsigned int ThreadCount = std::thread_hardware_concurrency() < count ? std::thread_hardware_concurrency() - 1 : count;m_Data.InitQuque(dir);//多線程開始前初始化數據unsigned int number = m_Data.GetQueueSize();while(!m_Data.IsQueueEmpty()){while(ThreadCount > 0){std::string file;if(m_Data.GetQueueData(file)){std::thread th(&FileNode::ReadFile,&m_Data,file,std::ref(ThreadCount),std::ref(number));//ReadFile里面會互斥的修改ThreadCount和number,并通過引用返回結果std::mutex mut;mut.lock();ThreadCount--;//新分配了一個線程,ThreadCount就減少一個,主線程互斥修改mut.unlock();th.detach();//采用分離式執行子線程,不會阻塞主線程,多線程并行執行}else break}}//采用while循環使主線程等待所有子線程執行完畢,保證主線程不會在子線程之前執行完畢而退出while(number > 0) continue; } #include <iostream> #include ”MultiThread.h“int main(){MultiThread MultiTh;MultiTh.RunMultiThread(10,"D:\\Data\\");return 0; }

總結

以上是生活随笔為你收集整理的C++11新特性以及std::thread多线程编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。