摘要:
一、std::async介绍 std::async用于创建异步任务,实际上就是创建一个线程异步执行相应任务,它接受回调(即函数或函数对象)作为参数。 std::async就是异步编程的高级封装,相当于封装了std::promise、std::packaged_task加上std::thread,基本 阅读全文
摘要:
一、C++11为什么要引入std::future? 我们经常会遇到需要从线程中返回异步任务结果的情况。例如在程序中,我们创建了一个压缩给定文件夹的线程,并且我们希望该线程能够返回新的 zip 文件的名称和大小。 在 C++11 之前的老方法是使用指针在线程间共享数据: 传递一个指针到新的线程中,该线 阅读全文
摘要:
一、问题场景 互斥锁std::mutex是一种最常见的线程间同步的手段,但是在有些情况下不太高效。 假设想实现一个简单的消费者生产者模型,一个线程往队列中放入数据,一个线程往队列中取数据,取数据前需要判断一下队列中确实有数据,由于这个队列是线程间共享的,所以,需要使用互斥锁进行保护,一个线程在往队列 阅读全文
摘要:
一、C++11为什么要引入原子操作? 首先为什么会有原子操作呢?这纯粹就是 C++ 这门语言的特性所决定的,C++ 这门语言是为性能而生的,它对性能的追求是没有极限的,它总是想尽一切办法提高性能。互斥锁是可以实现数据的同步,但同时是以牺牲性能为代价的。口说无凭,我们做个实验就知道了。 我们将一个数加 阅读全文
摘要:
一、前言 如果g_mutex.lock()和g_mutex.unlock()之间的语句发生了异常,会发生什么?看这个例子: #include <iostream> #include <thread> #include <mutex> // 实例化互斥锁对象,不要理解为定义变量 std::mutex 阅读全文
摘要:
一、什么是竞争条件? 在多线程环境中,线程间的数据共享很简单,但是在程序中这种简单的数据共享可能会引起问题,最常见的错误之一就是竞争条件(race condition),而其中最常见的就是数据竞争(data race)。 竞争条件是发生在多线程应用程序中的一种 bug。当两个或多个线程并行执行一组操 阅读全文
摘要:
一、构造函数的参数 std::thread类的构造函数是使用可变参数模板实现的,也就是说,可以传递任意个参数,第一个参数是线程的入口函数,而后面的若干个参数是该函数的参数。 第一个参数的类型并不是 C 语言中的函数指针,在 C++11 中,增加了**可调用对象(Callable Objects)** 阅读全文
摘要:
C98 标准中并没有线程库的存在,而在 C11 中终于提供了多线程的标准库,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。 一、创建线程 首先要引入头文件#include<thread>,C++11 中管理线程的函数和类在该头文件中声明,其中包括std::thread类,std::th 阅读全文
摘要:
一、什么是并发? **并发(concurrency)**在生活中随处可见,边走路边说话,边听歌边写代码。计算机术语中的"并发",指的是在单个系统里同时执行多个独立的活动,而不是顺序的一个接一个的执行。 对于单核 CPU 来说,在某个时刻只可能处理一个任务,但它却不是完全执行完一个任务再执行一个下一任 阅读全文
摘要:
一、stdfunction与stdbind双剑合璧 因为类成员函数都有一个默认的参数,this,作为第一个参数,这就导致了类成员函数不能直接赋值给std::function,这时候我们就需要std::bind了,简言之,std::bind的作用就是转换函数签名,将缺少的参数补上,将多了的参数去掉,甚 阅读全文
摘要:
在理解“回调函数”之前,首先讨论下函数指针的概念。 一、函数指针概述 指针是一个变量,是用来指向内存地址的。一个程序运行时,所有和运行相关的物件都是需要加载到内存中,这就决定了程序运行时的任何物件都可以用指针来指向它。函数是存放在内存代码区域内的,它们同样有地址,因此同样可以用指针来存取函数,把这种 阅读全文
摘要:
简短介绍软件版本号的一般定义原则和一些相关知识。 一、格式 主版本号.次版本号.修订号 例: 1.0.0 二、递增规则 主版本号:当你做了不兼容的 API 修改。 次版本号:当你做了向下兼容的功能性新增。 修订号:当你做了向下兼容的问题修正。 三、先行版本号 先行版本号可以加到”主版本号.次版本号. 阅读全文
摘要:
转自:陪她去流浪的C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现 前言 大家都应该知道C的精髓是虚函数吧? 虚函数带来的好处就是: 可以定义一个基类的指针, 其指向一个继承类, 当通过基类的指针去调用函数时, 可以在运行时决定该调用基类的函数还是继承类的函数. 虚函数是实现多态(动态绑 阅读全文
摘要:
一、weak_ptr弱引用的智能指针 1.1 shared_ptr相互引用会有什么后果? shared_ptr的一个最大的陷阱是循环引用,循环引用会导致堆内存无法正确释放,导致内存泄漏。看下面的例子: #include <iostream> #include <memory> class Paren 阅读全文
摘要:
C++ 程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。但使用普通指针,容易造成内存泄露(忘记释放)、二次释放、程序发生异常时内存泄露等问题等。所有 C++11 就引入了智能指针。 一、原始指针容易发生内存泄漏 C 语言中最常使用的是malloc()函数分配内存,free 阅读全文
摘要:
一、VS2019安装 现在 Visual Studio 的最新版本已经升级到了 VS2019,另外 VS2019 社区版也是完全免费的,所以就准备升级到 VS2019 了,不再用 VS2015 了。 官方下载地址:https://visualstudio.microsoft.com/zh-hans/ 阅读全文
摘要:
一、C++11为什么要引入Lambda表达式? 编写程序时,往往会大量用到函数,为此要编写很多类。有的类只用来定义了一个函数成员,而且这个函数也只使用了一次,编写这样的类就有点浪费。而且,定义类的地方和使用成员函数的地方可能相隔较远,查看其 operator() 成员函数也比较麻烦。 对于只使用一次 阅读全文
摘要:
一、C++11为什么要引入std::bind? C++11 引入了std::bind,顾名思义,是用来绑定函数调用的某些参数的。std::bind能改造现有函数,生成新的函数。举例说明,现在有这么个函数声明: int f(int a, int b); 我现在需求,我要一个有 2 个 int 类型参数 阅读全文
摘要:
博客《C++11 新特性总结》描述了一些 C++11 带来的新的特性,但是不够全面。所以写该博客做一个简要补充。在实际工作中,std::function 经常用来实现回调函数。 一、C++11为什么要引入std::function? 在 C++03 的时代,是使用函数指针来把一个函数作为参数传递,这 阅读全文