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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下Java连接数据库出现 Access denied for user 'root'@'localhost' (using password: YES)错误

一、问题描述 centos 7 终端键入 mysql -u root -p 输入密码后可成功访问数据库&#xff0c;但使用IDEA编写Java代码实现数据库连接时却出现Access denied for user ‘root’‘localhost’ (using password: YES) 错误。 二、解决方法 在刚安装mysql时&#xff0c;系统会默认…

Zookeeper常用命令行及API

一、Zookeeper常用命令行 1.启动zookeeper客户端(在启动zookeeper集群后启动进行调试) zkCli.sh   2.查看帮助、操作历史 help、history 3.查看当前Znode的目录 ls /    ls2 /  (查看当前Znode的详细信息) 4.创建Znode (1)默认&#xff1a;create 路径 内容 create /Wy…

被骗两次?黄仁勋骗过世界的14秒,英伟达押宝未来的元宇宙……

来源&#xff1a;物联网智库在近期召开的计算机图形顶级会议ACM SIGGRAPH 2021 上&#xff0c;英伟达介绍了自研的3D仿真模拟和协作平台Omniverse&#xff0c;并放出了“合成版老黄”的打造过程。有媒体据此报道称——万万没想到&#xff0c;在3个月前的GTC大会中&#xff0c;厨…

QT清单打印程序

1.主要代码 //customer.h文件 #ifndef CUSTOMER_H #define CUSTOMER_H#include <QObject> #include <string>class Customer : public QObject {Q_OBJECT public:explicit Customer(QObject *parent nullptr);Customer(const Customer& customer);void setCo…

Linux下生成指定大小文件(命令+Java程序)

1、dd命令 of&#xff1a;fileName为文件名称&#xff0c;例如test.txt &#xff1b; bs&#xff1a;设置一次复制的大小&#xff0c;例如1M&#xff1b; count&#xff1a;设置复制次数&#xff0c;例如100&#xff1b; dd if/dev/zero of<fileName> bs<一次复制…

C语言之随机数函数( rand() )的使用方法

文章出自个人博客https://knightyun.github.io/2018/04/25/c-rand-number&#xff0c;转载请申明。 在程序设计中&#xff0c;难免会使用到随机值函数&#xff0c;其原理与语法大多类似&#xff0c;接下来以C语言为例介绍其随机值函数 rand() 用法。 原理 引用百度百科&#xf…

图灵奖得主杨立昆:人工智能比你更聪明吗?

来源&#xff1a;混沌巡洋舰人工智能常常被认为是一项将要颠覆世界的技术&#xff0c;从这一概念诞生至今的65年中&#xff0c;无数电影与小说塑造了各种经典的人工智能角色&#xff0c;AI &#xff08;Artificial Intelligence&#xff09;也很快成为人类未来世界蓝图中的重要…

(转)Windows系统、Linux系统 和 Mac OS操作系统 历史由来 与 区别?

目录 1 UNIX 由来 2 Linux 由来 3 Windows与Linux的主要区别 4 关于Linux的一些疑惑 参考资料 目前常见的三大操作系统&#xff1a;Windows系统、Linux系统 和 Mac OS操作系统。 首先&#xff0c;不管是Windows操作系统、Linux系统还是苹果的Mac OS操作系统&#xff0c;甚…

国务院公布《关键信息基础设施安全保护条例》

来源&#xff1a;中国政府网编辑&#xff1a;蒲蒲据中国政府网8月17日消息&#xff0c;《关键信息基础设施安全保护条例》已经2021年4月27日国务院第133次常务会议通过&#xff0c;现予公布&#xff0c;自2021年9月1日起施行。条例指出&#xff0c;国家对关键信息基础设施实行重…

hadoop碰到的 一个问题

在里面添加/usr/local/hadoop/etc/hadoop/log4j.properties log4j.logger.org.apache.hadoop.util.NativeCodeLoaderDEBUG 可以查看debug信息&#xff1a; [rootelk03 hadoop]# hdfs dfs -ls /19/02/26 01:19:37 DEBUG util.NativeCodeLoader: Trying to load the custom-built…

SpringBoot笔记整理(一)

SpringBoot笔记整理&#xff08;一&#xff09; SpringBoot笔记整理&#xff08;二&#xff09; SpringBoot笔记整理&#xff08;三&#xff09; SpringBoot笔记整理&#xff08;四&#xff09; 1、使用Spring Initializer快速创建Springboot项目 默认生成的Spring Boot项目&…

文章推荐 | 城市规划中城市信息学的研究进展

来源&#xff1a;北京城市实验室BCL随着计算机技术的飞速发展&#xff0c;城市信息学作为城市规划领域的一门新兴学科&#xff0c;逐渐引起学术界的关注。城市信息学的兴起给城市规划带来了新的压力&#xff0c;但它也提供了新的城市分析视角。在此背景下&#xff0c;专家小组概…

Matlab基础

一.入门基础 1.基本知识 1.1 输入命令 以分号结尾不会打印变量的值 x 1 y x;1.2 变量命名规则&#xff1a;以字母开头&#xff0c;并且仅包含字母、数字和下划线。 1.3 使用save命令将工作区中的变量保存到MAT文件的MATLAB特定格式文件中,文件名为datafile.mat。可以指定保…

3年规模翻7倍统治 5G、IoT时代,化合物半导体材料深度报告

来源 华西证券编辑&#xff1a;智东西内参作者&#xff1a;吴吉森 等随着 5G、IoT 物联网时代的来临&#xff0c;以砷化镓&#xff08;GaAs&#xff09;、氮化镓&#xff08;GaN&#xff09;、碳化硅&#xff08;SiC&#xff09;为代表的化合物半导体市场有望快速崛起。其中&am…

SpringBoot笔记整理(二)

SpringBoot笔记整理&#xff08;一&#xff09; SpringBoot笔记整理&#xff08;二&#xff09; SpringBoot笔记整理&#xff08;三&#xff09; SpringBoot笔记整理&#xff08;四&#xff09; Spring Boot与日志&#xff08;日志框架、日志配置&#xff09; 1、市面上的日志…

MATLAB图像处理基础

1.导入数据 1.1 使用readtable("")导入数据&#xff0c;并存储在表格中&#xff0c;使用axis equal可以校正坐标轴纵横比。 letter readtable("M.txt"); plot(letter.X,letter.Y) axis equal1.2 range(x)函数返回x的值的范围&#xff0c;即max(x) - min(…

BBWebImage 设计思路

BBWebImage 设计思路 BBWebImage 是高性能 Swift 图片组件&#xff0c;用于图片下载、缓存、编解码、编辑与展示。 GitHub 地址&#xff1a; https://github.com/Silence-GitHub/BBWebImage 效果图 下载、展示并缓存原图 下载、渐进式解码、编辑图片&#xff0c;缓存编辑后的图…

清华本科、港科大准博士被指论文抄袭,网友:这是有技巧的“洗稿”

来源&#xff1a;整理自新智元、Reddit、知乎等不是吧&#xff1f;清华自动化本科&#xff0c;香港科技大学硕士生发表的顶会论文竟然是抄的&#xff1f;而且抄袭对象还是另一篇顶会论文&#xff1f;近日&#xff0c;眼尖的网友发现两篇分别发表在 ICML 2021 和 ICCV 2021 两大…

MATLAB深度学习入门

1. 加载图像 1.1 使用imread函数加载图像&#xff0c;可以加载GIF、JPEG、PNG等大多数标准文件格式图像。 Import an image img imread("file.jpg")1.2 采用**imshow()**来显示图像。 imshow(img)1.3 采用alexnet函数可以创建预定义的深度网络AlexNet的副本。 de…

SpringBoot笔记整理(三)

SpringBoot笔记整理&#xff08;一&#xff09; SpringBoot笔记整理&#xff08;二&#xff09; SpringBoot笔记整理&#xff08;三&#xff09; SpringBoot笔记整理&#xff08;四&#xff09; Web开发 1、使用SpringBoot&#xff1a; 1&#xff09;创建SpringBoot应用&…