C++新特性
文章平均质量分 87
C++新特性学习
橡秄
我亦无他,唯手熟尔
展开
-
C++新特性(六)多线程(5)async、future、packaged_task、shared_future、promise
一,async函数与future对象的使用(顺便简单引入future)1,async的普遍用法std::async是一个函数模板,用来启动一个异步任务,启动起来一个异步任务之后,它返回一个std::future对象,这个对象是个类模板。什么叫“启动一个异步任务”?就是自动创建一个线程,并开始 执行对应的线程入口函数,它返回一个std::future对象,这个std::future对象中就含有线程入口函数所返回的结果,我们可以通过调用future对象的成员函数get()来获取结果。下面给出一个使用例子原创 2022-02-17 15:03:02 · 756 阅读 · 0 评论 -
C++新特性(六)多线程(4)condition_variable(条件变量)、wait、notify_one、notify_all
一,条件变量的作用学过操作系统的同学们应该知道,在进程管理那一章节,为了管理进程互斥进入临界区有了互斥信号量,这和我们线程里互斥访问共享数据思路差不多。但进程管理中同样有进程同步的管理,例如最经典的生产者消费者问题:缓冲区可容纳10个产品,因此生产者生产时必须先确定缓冲区有空位;消费者消费时必须确定缓冲区有产品。对于我们上一篇讲的场景来说——该场景模拟一个简单的游戏服务器,该服务器中有两个线程,一个线程负责往一个共享队列写玩家命令数据;另一个线程负责从这个共享队列中读取玩家命令并执行。共享队列的长度没有限原创 2022-02-16 17:13:32 · 2064 阅读 · 4 评论 -
C++新特性(六)多线程(3)unique_lock类模板
一,unique_lock类模板取代lock_guard1,unique_lock是个类模板,工作中,一般lock_guard(推荐使用); lock_guard取代了mutex的lock()和unlock()2,unique_lock比lock_guard灵活很多;效率上差一点,内存占用多一点。因此,如果我们工作中想要使用unique_lock,一般是考虑到他的灵活性。3,普通的lock_guard使用语句为:lock_guard<mutex> sbguard(my_mutex);而普通原创 2022-02-16 15:11:41 · 646 阅读 · 0 评论 -
C++新特性(六)多线程(2)线程中互斥量的使用,mutex对象使用,lock_guard类模板,死锁的解决
一,创建多个线程前面学习了怎么使用thread类创建一个线程C++新特性(六)多线程(1)线程启动、结束,创建线程、join,detach,线程传参详解,在实际应用中,我们可以创建多个线程void TextThread(){ cout << "我是线程" << this_thread::get_id() << endl; /* … */ cout << "线程" << this_thread::get_id原创 2022-02-15 18:28:41 · 682 阅读 · 0 评论 -
C++新特性(六)多线程(1)线程启动、结束,创建线程、join,detach,线程传参详解
1,整个程序从main函数开始执行主线程,而我们自己创建的线程,同样是由一个我们自己定义的函数开始执行。2,整个进程是否执行完毕的标志是主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了;此时,一般情况下:如果其他子线程还没有执行完毕,那么这些子线程也会被操作系统强行终止。所以,一般情况下,我们得到一个结论:如果大家想保持子线程的运行状态的话,那么要让主线程一直保持运行,当然这种规定也有例外,以后会讲到。3,头文件#include<thread>4,一个超级简单的多线程例子演原创 2022-02-10 17:41:01 · 1530 阅读 · 1 评论 -
C++新特性(五)智能指针
不同于java的垃圾回收机制,C++需要程序员自己申请资源,使用完资源以后还要记得释放资源,例如new和delete要配套使用;文件打开以后使用完要关闭;数据库连接以后使用完要断开…这都是程序员需要额外注意的点。忘记了资源释放,会造成资源泄露。为了做到智能释放使用完的资源,C++有了智能指针的技术。结合类使用了引用计数的想法,使程序员不用再担心资源释放的问题。(RAII思想)下面先介绍一下RAII思想1,RAII思想众所周知,一个类对象创建会自动调用构造函数,析构会自动调用析构函数。因此我们可以利用此原创 2022-02-03 20:36:46 · 1221 阅读 · 0 评论 -
C++新特性(四)函数对象包装器function与bind
1,函数对象包装器函数对象包装器的意思是将整个函数包装起来,包装成一个容器,以后要使用该函数的时候只需要调用该容器即可。头文件#include<functional>例子:函数对象包装器支持4种函数的包装,使得函数的表达都成了一个统一的整体。1,普通函数2,匿名函数3,普通成员函数4,仿函数(重载了运算符()的函数)其中1的对象包装已经演示过,而下面的代码演示了全部四种函数的包装。读者可直接通过运行下面代码理解#include<iostream>#includ原创 2022-02-02 20:12:15 · 801 阅读 · 0 评论 -
C++新特性(三)lambda表达式与匿名函数
lambda表达式就是匿名函数,既然都称呼其为匿名函数了,也就是说它是一个函数!这个函数不用去设置函数名。1,基本语法[捕获列表](参数列表)mutable(可选)异常属性->返回类型{//函数体}//举例://[]挂获列表(参数列表->返回值[](int a.. int b) -> int{//函数体return a + b;}//该例子没有演示捕获列表以及mutable的用法,在后文会介绍。1.1 匿名函数的用法(1)可以看到,因为匿名函数没有名字,所以我原创 2022-02-02 17:32:52 · 661 阅读 · 0 评论 -
C++新特性(二)更安全的强制类型转换
C语言原来有简单的语法实现强制类型转换,为什么C++还要确定新特性实现强制类型转换呢?归根到底是因为C语言强制类型转换有以下三个缺点。1,没有从形式上体现转换功能和风险的不同。例如,将int强制转换成double是没有风险的,而将常量指针转换成非常量指针,将基类指针转换成派生类指针都是高风险的,而且后两者带来的风险不同(即可能引发不同种类的错误) , C语言的强制类型转换形式对这些不同并不加以区分。2,将多态基类指针转换成派生类指针时不检查安全性,即无法判断转换后的指针是否确实指向一个派生类对象。3原创 2022-01-26 11:22:39 · 3401 阅读 · 0 评论 -
C++新特性(一)nullptr,constexptr,迭代器与类型推导auto,委托构造与继承构造,虚函数override以及类的final
1,nullptr字面意思可以看到,nullptr指的是空指针的意思,在以前任意类型的指针可以直接用NULL赋值:char* p=NULL。然而实际上NULL在编译器内部是一个宏定义#define NULL 0。这就可能在某些情况下产生一些问题。例如:假设有两个函数重载void foo(int a){};///1void foo(char*a){};///2在main函数中调用foo(NULL);,显然该调用会去调用2函数,这有时候和我们的编写意图相违背。因此就有了nullptr关键字,就好像是原创 2022-01-22 21:46:50 · 785 阅读 · 0 评论