- 博客(16)
- 资源 (8)
- 收藏
- 关注
原创 网络编程中select、poll与epoll详解
网络编程中select、poll与epoll详解 在C/S中,存在多种I/O模型(详见历史文章—C/S编程中常见的I/O模型介绍)。select、poll与epoll用于其中的I/O复用模型中,其读写是同步阻塞的。相比普通的read、write操作,可以检测多个描述符。通过阅读,能够了解select、poll与epoll的优缺点,能掌握什么时候应该使用epoll,什么时候应该使用select/poll。文章目录网络编程中select、poll与epoll详解1.select函数1.1 函数
2021-05-26 11:19:36
1315
原创 如何实现组合选项的unordered_set或unordered_map
如何实现组合关键字的unordered_set/unordered_map在VC编译器中,使用unordered_set或unordered_map时,如果需要将多个选项作为关键字进行hash,例如将学生信息中的学号和姓名相结合标记,应该如何实现呢?STL库中提供了强大的hash function,该函数可以将数据进行hash,并将多个选项进行整合得到一个hash关键字,其实现如下。#include <string>#include <unordered_set>#incl
2021-05-19 10:37:39
275
原创 C/C++内存池管理机制
GNU C内存池管理机制在不同编译器中,malloc/free内存管理的实现方式有所区别,但都是使用的内存池机制进行管理。本小节介绍在GNU C中的内存池管理,通过阅读可以学习到以下内容:文章目录GNU C内存池管理机制1.为什么使用内存池管理内存2.内存池的底层结构设计3.内存池如何管理内存下面详细介绍。1.为什么使用内存池管理内存我们经常使用下面的语句进行malloc的内存分配:data_t* ptr = (data_t*)malloc(sizeof(data_t));但是,对于计算机而
2021-05-17 16:46:39
419
原创 C/C++内存分配new与malloc详解
1. C++内存分配调用过程 上图中,ptmalloc,tcmalloc与jemalloc等是malloc底层实现策略。相比之下,ptmalloc性能较弱,资源消耗较多,在高CPU核心数情况下jemalloc比tcmalloc性能要好。总之,内存池管理主要针对小内存分配进行,而大内存块由系统调用进行分配,如mmap内存映射。 C/C++内存分配原语有malloc,new,::operator new()和allocate(),其中可否重载关系如下:分配释放类别可否重载m
2021-02-27 17:25:03
1045
原创 C/C++内存管理
内存管理 只有地址总线上的地址是真实的物理地址,而在CPU中的地址都是逻辑地址;也就是说只有地址总线操作的内存时物理内存,其他都是虚拟内存。虚拟内存与物理内存的映射就是地址翻译的过程,不同的物理内存管理有着不同的映射方式。1.内存扩充技术 覆盖技术主要用于早期的操作系统中。交换主要在进程或作业之间完成,而覆盖技术在同一个进程或作业内完成。1.1 覆盖技术 一个程序不需要将所有的指令与数据放入到内存中,而是将程序划分为若干个相对独立的程序段,按照运行逻辑将那些不会同时运行的程序段共享同一块内
2021-02-27 15:44:50
330
原创 accept (EMFILE错误)文件描述符用尽解决方案
问题描述:accept处理连接时,若出现 EMFILE 错误不进行处理,则内核间隔性尝试连接,导致整个网络设计程序崩溃,因此需要处理这不当的请求。对于用户而言,处理该请求的关键就是文件描述符,然而没有请求成功就不存在相应的文件描述符,这是一个麻烦的问题,下面借由muduo库(方法来源于libev)简单说明一下解决方案。方案:事先创建一个指向空文件( /dev/null )的 idlefd 文...
2020-02-25 11:46:46
1611
原创 神奇的模板元编程——TMP
最近学习巨佬的《Effective C++》其中第48条款,下列内容均摘自于该条款,另加上了一点自己的个人见解。Template metaprogramming(TMP,模板元编程)是编写template-based C++程序并执行于编译器的过程。TMP有两个伟大的效力1.他让某些事情更容易;2.由于TMP执行于C++编译期间,所以可将工作从运行期转移到编译期;有两大优势:·某些错...
2019-10-26 17:53:58
1111
原创 C++并发数据结构的内存回收
简介最近学习《CPP concurrency in action》的一些总结,文中的图片与程序皆是引用于该书。*数据结构并发编程中,内存回收一直是一个头疼的问题。下面简单介绍使用引用计数的方式,进行内存回收。背景:以最简单的数据结构——栈为例,进行在设计无锁的线程安全栈结构时,借助的是原子操作和内存顺序特性实现。栈结构设计,其本质就是对结点node指针进行操作,push()操作只有内存分配...
2019-07-22 20:15:26
716
原创 C++多线程内存模型
文中图片摘自《c++ concurrency in action》用于自我学习,存在不足,还请指正。内存模型基础在C/C++中,无论是常规的整型变量,还是结构体或是C++中的类,在计算机中都是在一定的内存位置进行存储的。而这个内存位置是在初始化就已经确定好,不同的内存位置,那么程序访问变量的顺序也有就不同。同样,在多线程程序中,如果程序的执行顺序不同,那么结果就有所区别。因此多线程程序中,原子...
2019-07-21 11:26:18
1244
原创 C++原子操作atomic库介绍
原子操作如名字所述,其操作是不可分割的操作。在多线程中,原子操作因不可分割性,对认识数据同步有这重要的作用,而且原子操作可以使用互斥锁进行模拟。标准原子类型定义在<atomic>头文件中,或许c++标志库中原子库的实现就是通过互斥锁模拟的,我们可以通过其方法is_lock_free()检测是否该类型内部是通过使用锁模拟的,若返回false则表示该原子类型是库或是编译器内部使用一个锁实现...
2019-07-20 17:20:51
1179
原创 进程join和detach注意事项
join就是加入线程,调用线程等到被调用线程结束之后,再继续进行;detach是分离线程,让其被调用线程自行运行,不必等待。但是值得注意的是,使用detach必须保证调用对象仍然有效。例如下图例子:**注意:**对于一个线程来说,只能调用join或是detach一次,不能重复对一个线程进行多次调用。可以使用joinable()查看是否可以调用,false表示线程不能再次join或是detac...
2019-07-09 14:52:35
1308
原创 C++中使用vector动态创建多维数组
容器在C++中是一个很重要的部分,如果熟练使用能够大大提高编程效率。本文简单介绍使用vector容器创建二维数组。下面是实现的案例**注意:**使用基于范围的for循环更改数组属性时,需要传递数组的地址或是引用才能更改成功,这与函数的传递类似。同时上面有:基于范围的for循环使用,算法库中的copy函数,可以直接将迭代器中数据搬移到输出流迭代器中,实现快速输出。(便于自己记忆,记录一下)...
2019-06-02 17:16:25
2938
原创 C++中可变参函数的几种实现方法
C++中,可变参函数列表的,用三种实现方法:• 使用继承于C语言头文件<stdarg.h>中的可变参宏:va_list va_start va_arg va_end进行参数扩展。宏说明:va_list----用于定义一个va_list类型的变量,为后面的扩展可变参列表做准备eg: va_list pvar;va_start—用于初始化va_list类型的变量eg:...
2019-04-24 19:06:14
6794
原创 高斯信道下信号相位估计
目的:在Eb/N0(5db~30db,间隔5db)下的加性高斯白噪声,并且假设信道(AWGN信道、瑞利信道)引入了30度的相位误差,采用QPSK调制信号作为导频信号,试仿真不同情况下的平均相位估计与采样点间曲线。改变里面参数,并分析其对相位估计的影响。主要原理介绍基本信道在通信系统中,对信道的研究有着重要的作用。信道的作用是把携有信息的信号(电的或光的)从它的输入端传递到输出端,因此,它的最...
2019-03-24 15:01:32
5960
3
原创 灵活的string类与istringstream的联合使用
C++库中有着便于开发的函数,string类就是其中一小部分。下面将介绍几个string类中非常有用的函数,并附加了用其实现的几个有用函数。str.find( childstr [,position] )该函数返回的是str中childstr子串第一次出现的位置,其中position为可选参数,该参数表示从第几个位置开始查找子串,默认为起始位置(position=0);str.replace...
2019-01-22 20:01:31
354
学生作业管理python实现
2019-03-24
存在相位误差的信号估计
2019-03-21
单片机实现软件I2C配置程序
2018-11-30
智能车MK系列芯片硬件I2C配置程序
2018-11-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人