C++
文章平均质量分 83
程序员一点
这个作者很懒,什么都没留下…
展开
-
C++程序编译之谜(三)——简单还是复杂?编译到底有哪些步骤?
通常我们用IDE写完一个程序后,点击编译按钮的时候,内部到底发生了什么?为什么会生成一个可执行文件?这个过程到底有哪些步骤呢?是很简单还是很复杂呢?这篇文章,我们把这些事情讲清楚。首先要明确一点,编译只是一个统称,编译的整个过程有预处理、编译、汇编和链接的过程我们给出一个特别简单的程序//test.c#include <stdio.h>#define max 5int main(){ printf("max = %d\n", max); return .原创 2021-02-14 16:25:33 · 380 阅读 · 0 评论 -
C++ STL快速入门
首先要说明一下这个STL内容都是概述性的,不是详细的内容,简单来说就是一些大概的框架性的,可以应付一些面试情况。但是要深入学习的话,必须要找更加详细的资料。不罗嗦,进入正题。STL是C++中的标准模板库,本文不深究STL的发展以及版本,以囫囵吞枣的形式讲一些STL组成部分。STL容器是STL学习中要重点关注的,STL容器有两大类,顺序容器和关联容器。顺序容器有可变长动态数组vector、双端队列deque、双向链表list,它们之所以被称为顺序容器,是因为元素在容器中的位置同元素的值无关,即原创 2021-01-14 16:03:25 · 173 阅读 · 0 评论 -
C++11多线程编程(九)——总结篇
这篇是多线程编程系列的总结篇,复盘一下前面讲到的多线程的各个知识点。要想成为一个优秀程序员,多线程编程是永远也绕不开的话题,必须要掌握,不同的语言实现多线程的方式都各不相同,但原理都是相通的。为何需要多线程,因为要充分利用CPU的性能,特别是多核CPU,提升效率,提高用户体验。早期的C++在语言级别上并不支持多线程,要实现多项只能依靠不同系统多线程函数,这给C++多线程编程带来了一定的麻烦。但在C++11开始,C++正式的支持了多线程编程。那么在多线程编程中需要考虑哪些问题呢?需要注意到的点是哪原创 2020-12-30 11:19:39 · 246 阅读 · 0 评论 -
C++11多线程编程(八)——死锁问题
一、死锁现象看到“死锁”二字,你是不是慌得不知所措。死锁,顾名思义就是这个锁死掉了,再也动不了了。那死锁是怎么产生的呢?当你对某个资源上锁后,却迟迟没有释放或者根本就无法释放,导致别的线程无法获得该资源的访问权限,进而程序无法运行下去,有点像是阻塞的现象。但是阻塞是一种正常现象,而死锁可以说是一种bug,必须要处理。那么我现在就举个死锁的例子,来分析分析。#include <iostream>#include <thread>#include <mutex.原创 2020-12-29 13:51:26 · 405 阅读 · 0 评论 -
C++11多线程编程(七)——信号量的实现
一、为何需要信号量信号量用来干嘛的呢?搜寻答案的话,很多人都会告诉你主要用于线程同步的,意思就是线程通信的。简单来说,比如我运行了2个线程A和B,但是我希望B线程在A线程之前执行,那么我们就可以用信号量来处理。有些人可能会疑惑,那么麻烦干嘛?你不是要B线程先执行吗?那么我让A线程休眠一点时间不就可以了吗?没错,这个思路是可以的,但是如果B线程也因为某些原因(比如硬件,操作系统的原因)导致延缓执行了,这该怎么办?到底A线程该休眠多少时间合适呢?所以正确的做法就是在B线程阻塞,A线程去唤醒这个阻塞线程。原创 2020-12-28 16:50:43 · 2022 阅读 · 0 评论 -
C++11多线程编程(六)——线程池的实现
学一门新技术,还是要问那个问题,为什么我们需要这个技术,这个技术能解决什么痛点。一、为何需要线程池那么为什么我们需要线程池技术呢?多线程编程用的好好的,干嘛还要引入线程池这个东西呢?引入一个新的技术肯定不是为了装逼,肯定是为了解决某个问题的,而服务端一般都是效率问题。我们可以看到多线程提高了CPU的使用率和程序的工作效率,但是如果有大量的线程,就会影响性能,因为要大量的创建与销毁,因为CPU需要在它们之间切换。线程池可以想象成一个池子,它的作用就是让每一个线程结束后,并不会销毁,而是放回到线.原创 2020-12-25 10:37:44 · 359 阅读 · 0 评论 -
C++11多线程编程(五)——生产消费者模型之条件变量
当某个线程持有这把锁的时候(就是所谓的加锁),那么这个线程是独占所有的资源,这里的资源指的是执行的权限,其他要抢夺资源的线程都不得不等待。在很多情况下,这都容易适用,但是有些情况下,却会产生一些异常情况。在生产消费者模型当中,肯定都会用到互斥锁的机制的,当生产者往队列中放数据的瞬间,消费者是不能取数据的,那这时候可能会碰见一个问题,如果生成者因为某些原因,放数据过慢,但是消费者取数据很快,当队列中没有数据了,消费者还去取的话,就会发生异常情况。有些人可能会说,加个条件判断一下队列是否为空不就可以了。原创 2020-12-23 14:04:58 · 300 阅读 · 0 评论 -
C++11多线程编程(四)——原子操作
今天和大家说说C++多线程中的原子操作。首先为什么会有原子操作呢?这纯粹就是C++这门语言的特性所决定的,C++这门语言是为性能而生的,它对性能的追求是没有极限的,它总是想尽一切办法提高性能。互斥锁是可以实现数据的同步,但同时是以牺牲性能为代价的。口说无凭,我们做个实验就知道了。我们将一个数加一再减一,循环一定的次数,开启20个线程来观察,这个正确的结果应该是等于0的。首先是不加任何互斥锁同步#include <iostream>#include <thread>.原创 2020-12-22 16:09:56 · 778 阅读 · 0 评论 -
C++11多线程编程(三)——lock_guard和unique_lock
如果熟悉C++多线程的童鞋可能有了解到实现的互斥锁的机制还有这个写法lock_guard<mutex> guard(mt);那么这句话是什么意思呢?为什么又要搞个这样的写法呢?这个也是构造互斥锁的写法,就是会在lock_guard构造函数里加锁,在析构函数里解锁,之所以搞了这个写法,C++委员会的解释是防止使用mutex加锁解锁的时候,忘记解锁unlock了。#include <iostream>#include <thread>#includ原创 2020-12-21 14:50:13 · 565 阅读 · 0 评论 -
C++11多线程编程(二)——互斥锁mutex用法
还是那个问题,编程世界中学习一个新的技术点,一定要明白一件事,为什么要出现这个技术点,只有弄懂了这个才能从根本上有学习的动力。那么为什么要出现多线程锁这个东西呢?一句话概括的话。为了保证数据的准确性!计算机就是为了计算数据才诞生的,如果不能保证数据准确的话,任何技术都只是空中楼阁,多线程技术也是一样,那么为什么多线程会让数据不准确呢?大家可以看下以下的这个例子#include <iostream>#include <thread>#include <.原创 2020-12-06 14:45:28 · 737 阅读 · 0 评论 -
C++11多线程编程(一)——初始多线程
首先还是那个问题,我们为什么需要多线程?单线程编程做的好好的,又简单又好用,为什么要弄出一个多线程编程呢?难道前人是为了设计而设计了个多线程的?显然这是不可能,那么是什么原因呢?用最精炼的语言概括无非就是以下两个原因。效率和用户体验效率主要体现在服务端,用户体验更多是体现在客户端,当然肯定不是说效率只体现在服务端,用户体验只体现在客户端,无论是效率还是用户体验在服务端和客户端上都会体现,只是说侧重点不一样,这一点大家要注意下。那么多线程到底是什么呢?在计算机术语中也可以叫并发,指的是在.原创 2020-12-04 22:25:26 · 594 阅读 · 1 评论