C++
文章平均质量分 93
竹烟淮雨
如果结果不如你所愿
就在尘埃落定前奋力一搏
展开
-
C++多线程编程——线程同步(保姆级-1.4W字)
线程同步是一种编程技术,它用于在多线程环境中确保多个线程能够正确、安全地共享和访问共享资源。线程同步的主要目的是防止数据竞争和不一致性,以及避免多个线程同时对同一数据进行修改或访问导致的问题。原创 2023-08-25 17:11:54 · 1472 阅读 · 0 评论 -
C++多线程编程——thread线程创建与使用(2W字保姆级介绍)
同步执行:同步,是所有的操作都做完,才返回给用户结果异步执行:异步,不用等所有操作都做完,就响应用户请求处理耗时操作(数据库大量写入或者查询、文件下载、复杂计算)同步操作:所有的操作都做完,才返回给用户,这样用户在线等待的时间太长,给用户一种卡死了的感觉异步操作:即先响应用户请求然后慢慢去执行耗时操作,用户体验较好。原创 2023-08-25 04:04:46 · 2997 阅读 · 0 评论 -
线程池的概念及实现原理
线程池是一种使用多个线程来执行任务的机制,其中线程的数量是固定的。而使用线程池可以预先创建一组线程,重复利用这些线程,从而减少线程的创建和销毁开销,提高程序的效率。线程池的实现原理,假设现在有一个服务器,当服务器运行起来的时候会创建一个线程池,我们规定线程池里面有100个线程。而使用线程池可以将任务分配给池中的线程,避免了频繁的线程创建和销毁,减少了线程间的通信开销,从而提高了多线程程序的效率。服务器在接收到客户端的响应,将需要做的事情都放在任务队列里,线程池中的线程就实时去处理任务队列中的任务。原创 2023-08-25 03:38:42 · 502 阅读 · 0 评论 -
线程池的实现v2.0(可伸缩线程池)
对之前V1.0版本的静态线程池进行修改,添加了一个名为management_thread的管理线程,该线程会根据任务队列的任务数量动态管理线程池中的线程数量。管理线程会在每次循环中根据一定的条件增加或减少线程数量,然后休眠一段时间后继续检查。对于静态线程池,我们额外引入一个管理线程专门来管理线程池。当线程池中的线程数量不足够匹配任务队列里的任务量,就增加线程;如果线程数量超出了任务队列的任务量,就减少线程。具体可伸缩的条件由我们自己来规定,比如说待处理的任务数>正在工作的线程数*2,就增加线程;原创 2023-08-22 23:24:10 · 315 阅读 · 0 评论 -
线程池的实现全过程v1.0版本(手把手创建,看完必掌握!!!)
实现线程池首先要确定线程池有哪些属性(1)线程池中线程的数量(2)线程池中已工作的线程数量(3)任务队列(4)任务队列的大小(5)任务队列的锁还需要确定线程池的三种条件情况(1)任务队列为空时:线程池里的线程需要阻塞等待(2)任务队列为满:不能再新增任务(3)任务队列不为空:线程池里的线程处理任务原创 2023-08-22 02:27:28 · 450 阅读 · 0 评论 -
线程和进程同步互斥你真的掌握了吗?(同步互斥机制保姆级讲解与应用)
互斥:同一时间,只能一个任务(进程或线程)执行,谁先运行不确定。同步:同一时间,只能一个任务(进程或线程)执行,有顺序的运行。同步 是特殊的 互斥。原创 2023-08-20 21:38:45 · 1148 阅读 · 0 评论 -
C++ STL常用算法(详解)
作为一门面向对象的编程语言,使用 C++ 编写程序有一个缺点,即随着代码面向对象程度的提高,其执行效率反而会降低。例如,经实验证明几乎在所有情况下,直接操作一个 double 类型变量的执行效率,要比操作一个含 double 类型成员属性的类对象更高。对于大多数读者来说,以上所说是很容易想通的,因为它符合我们对高级编程语言的认知。但本节要介绍的内容,一定程序上会打破这个认知。原创 2023-08-18 09:56:36 · 570 阅读 · 0 评论 -
C++ STL迭代器适配器(详解)
本节讲解了 3 种插入迭代器,虽然它们都可以借助重载的赋值运算符,实现向目标容器的指定位置插入新元素,但在实际应用中,它们通常和 copy() 函数连用,即作为 copy() 函数的第 3 个参数。有关 copy() 函数的具体用法,由于不是本节重点,这里不再赘述,后续章节会做详细讲解。原创 2023-08-18 09:53:55 · 668 阅读 · 0 评论 -
C++ STL容器适配器(详解)
前面讲解 priority_queue 容器适配器时,还遗留一个问题,即当 头文件提供的排序方式(std::less 和 std::greater)不再适用时,如何自定义一个满足需求的排序规则。首先,无论 priority_queue 中存储的是基础数据类型(int、double 等),还是 string 类对象或者自定义的类对象,都可以使用函数对象的方式自定义排序规则。//函数对象类class cmppublic://重载 () 运算符int main()while (!原创 2023-08-18 09:52:37 · 425 阅读 · 0 评论 -
C++ STL无序关联式容器(详解)
前面在讲解 unordered_map、unordered_multimap、unordered_set 以及 unordered_multiset 这 4 种无序关联式容器(哈希容器)时,遗留过一个共性问题,即如何给无序容器自定义一个哈希函数和比较规则?注意,虽然每种无序容器都指定了默认的 hash 哈希函数和 equal_to 比较规则,但它们仅适用于存储基本类型(比如 int、double、float、string 等)数据的无序容器。原创 2023-08-18 09:49:31 · 1309 阅读 · 0 评论 -
C++ STL关联式容器(详解)
前面在讲解如何创建 map、multimap、set 以及 multiset 容器时,遗留了一个问题,即如何自定义关联式容器中的排序规则?实际上,为关联式容器自定义排序规则的方法,已经在 《STL priority_queue自定义排序方法》一节中做了详细的讲解。换句话说,为 Priority_queue 容器适配器自定义排序规则的方法,同样适用于所有关联式容器。总的来说,为关联式容器自定义排序规则,有以下 2 种方法。在掌握此方法之前,读者必须对函数对象有基本的了解,可阅读《C++函数对象》一节。原创 2023-08-18 09:47:26 · 289 阅读 · 0 评论 -
C++ STL序列式容器(详解)
尽管不同容器对应着不同类别的迭代器,但这些迭代器有着较为统一的定义方式,具体分为 4 种,如表 1 所示。迭代器定义方式具体格式正向迭代器容器类名::iterator 迭代器名;常量正向迭代器容器类名::const_iterator 迭代器名;反向迭代器容器类名::reverse_iterator 迭代器名;常量反向迭代器容器类名::const_reverse_iterator 迭代器名;原创 2023-08-18 09:44:41 · 811 阅读 · 0 评论 -
相对于多进程,你真的知道为什么要使用多线程吗(C/C++多线程编程)
1、线程与进程的区别要能在面试时侃侃而谈至少五分钟。二者的区别详细可以参考以下博客,这是我觉得写得非常好的一篇博客:线程与进程,你真得理解了吗2、本文除了介绍线程与进程的区别,还包括了C语言中POSIX线程库的使用以及对线程的同步与互斥的复习,最后还引入了线程池的概念,之后将从C语言的多线程过度到C++线程池的实现。原创 2023-08-18 01:58:19 · 503 阅读 · 0 评论 -
C++文件类(整理自C语言中文网-全)
文件刚打开时,文件读指针指向文件的开头(如果以 ios::app 方式打开,则指向文件末尾),用 read() 方法读取 n 个字节,读指针指向的位置就向后移动 n 个字节。注意,和 put() 方法一样,操作系统在接收到 get() 方法的请求后,哪怕只读取一个字符,也会一次性从文件中将很多数据(通常至少是 512 个字节,因为硬盘的一个扇区是 512 B)读到一块内存空间中(可称为文件流输入缓冲区),这样当读取下一个字符时,就不需要再访问硬盘中的文件,直接从该缓冲区中读取即可。原创 2023-08-12 02:27:05 · 1023 阅读 · 0 评论 -
C++封装思想之二:友元机制和运算符重载(1W字详解)
友元的作用:类的非成员函数可以直接访问类的非公有成员变量,省去函数的调用和访回过程。从而提高了程序的运行效率(即减少了类型和安全性检查及调用的时间开销)运算符重载的作用可以提高程序的可读性体现了C++的可扩充性运算符重载仅仅只是语法上的方便,它是另一种函数调用的方式运算符重载,本质上是函数重载原创 2023-08-04 17:15:05 · 1167 阅读 · 0 评论 -
C++封装思想之一:封装(1.8W字详解)
通过类的封装,实现对外提供接口,屏蔽数据,对内开放数据,保证代码的独立性(内聚性),提高代码的维护性C++的封装:class 封装的本质,在于将数据和行为,绑定在一起然后通过对象来完成操作。性能优化更方便性能:地址跳转访问(内部:更复杂的访问机制)我们在编写栈类的时候,使用自定义的init函数来实现栈的初始化,但是我们在人为操作的时候可能会忘记初始化。因此C++引入了构造函数。构造函数的定义及特点注意如果编写了自定义有参构造函数,会自动屏蔽默认构造函数,导致默认构造函数无法调用。可以将有参构造函数的参数设置原创 2023-08-04 01:31:33 · 1771 阅读 · 0 评论 -
C++对C的加强(全)
**namespace 是C++中的关键字,用来定义一个命名空间,语法格式为:变量函数类name是命名空间的名字,它里面可以包含变量、函数、类、typedef、#define 等,最后由{ }包围**/// 定义一个命名空间,名字叫NameSpaceAint a = 0;// 命名空间的定义可以嵌套int a = 1;int age;传统使用typedef来重命名类型C++增加使用using来重命名类型。原创 2023-07-27 00:09:56 · 766 阅读 · 0 评论 -
为什么要学习C++、C++在嵌入式开发领域中的作用(重要!!!)
学习C++的意义可以帮助巩固和复习C语言,了解面向结构和面向对象语言之间的区别与联系帮助快速学习其他语言以面向对象的思想帮助系统的设计及架构面向对象带来的好处易维护和易扩展:由于封装和模块化,每个对象都有清晰的接口和功能,易于维护和扩展。可复用:通过继承和组合可以重用代码。模块化:将一个大系统分解成相互合作的小模块。真实映射:面向对象可以更自然的映射真实世界的事物与概念。高内聚低耦合:每个对象只关注自身的行为和数据,与其他对象松散耦合,易于维护和修改。原创 2023-07-26 23:46:49 · 1605 阅读 · 0 评论