- 博客(54)
- 收藏
- 关注
原创 OpenCV链接库失败,报错 无法解析的外部符号
当把opencv的头文件路径、库路径设置好,后仍然无法在程序中使用opencv的函数,报错“无法解析的外部符号”。在CMakeLists文件中改为正确的库文件版本名称即可。
2025-04-06 12:47:59
192
原创 C++多线程异步日志实现
使用C++11标准,利用多线程,构建了一个方便使用的、轻量化的日志系统。封装线程安全的lockQueue,实现对每条日志添加信息、push到lockQueue中的LogTmp类,实现一个多线程异步的日志系统Logger。
2024-06-24 21:23:35
387
原创 C++实现简单的哈希表
使用计算哈希地址,使用解决哈希冲突,使用模板编程实现value为任意类型,但是key值只能是整型。链表使用C++STL库中的list,实现了一个简单的哈希表。
2024-06-22 14:53:07
202
原创 【Muduo】TcpServer类
TcpServer统领之前所有的类,是用户直接使用的类。它通过ThreadPool管理所有的loopthread,保存所有的TcpConnection,保存用户提供的各种回调函数并向TcpConnection的Channel中注册回调。它负责监听指定的端口,并接受来自客户端的连接请求,为每个连接创建一个TcpConnection对象进行管理。它的业务逻辑较先前的三大组件来说,还是比较简明的。
2024-05-24 20:28:35
493
原创 【Muduo】TcpConnection类
Muduo网络库的TcpConnection类代表了TCP连接的一端,即服务器与远程对等端之间的连接。TcpConnection类知道自身和对端的InetAddress、封装了前面讲过的Socket类和Channel类,并且保有管理自己的subLoop指针,还有多种事件处理函数和回调,还有属于自己的接收Buffer/发送Buffer。为上层应用提供了简洁的接口来处理连接的生命周期和数据传输。
2024-05-24 19:33:23
1046
原创 【Muduo】缓冲区Buffer类
在 Muduo 网络库中,Buffer类用于处理网络 I/O 中的数据缓冲。防止应用程序读写太快而网络链路收发速度慢导致的速度不匹配问题。这个类封装了一个内部缓冲区(使用了),并提供了一系列方法来操作这个缓冲区,如读取、写入、扩容等。
2024-05-24 19:08:06
673
原创 非阻塞sokcet和epoll
在Muduo网络库中同时使用了非阻塞socket与epoll,在此简单梳理下。非阻塞sokcet和epoll共同工作的过程主要涉及网络编程中的非阻塞I/O和事件驱动机制。readwriteacceptfcntlO_NONBLOCKreadwrite-1此图是模型图。epoll属于IO复用的一种。图中下方的read可以是阻塞IO,也可是本文讲的非阻塞IO。需要注意的是,当使用非阻塞socket和epoll的ET模式结合进行编程时,需要特别注意数据的完整性和连接的稳定性。
2024-05-24 18:57:19
1124
原创 【Muduo】接收新连接的Acceptor类
在 Muduo 的设计中,Acceptor类扮演着接受客户端连接请求的关键角色,其运行在每一个TcpServer实例中。一个服务器通常只创建一个监听socket描述字,故其在TcpServer中只有一个,用来监听服务器的唯一socket。它也会将传来的mainLoop和acceptSocket封装成一个Channel,这个Channel只对读事件感兴趣,也就是说,只通过回调函数 handleRead() 处理有新客户端连接请求的事件。* loop_:指向EventLoop的指针,用于处理 I/O 事件。
2024-05-24 18:27:37
921
原创 ubuntu下交叉编译安卓FFmpeg 和 官方指导链接
Linux系统:Ubuntu 18.04.6 LTS。交叉编译工具链:gcc-aarch64-linux-gnu g+±aarch64-linux-gnu。ffmpeg版本:5.1.3。
2024-05-23 19:16:42
588
1
原创 ubuntu rk3399 自启脚本
可以看出,/etc/rc.local 的启动顺序是在网络后面,但是显然它少了 Install 段,也就没有定义如何做到开机启动,所以显然这样配置是无效的。前面我们说 systemd 默认读取 /etc/systemd/system 下的配置文件, 所以还需要在 /etc/systemd/system 目录下创建软链接。默认读取 /etc/systemd/system 下的配置文件,该目录下的文件会链接/lib/systemd/system/下的文件。[Service] 段: 启动行为,如何启动,启动类型。
2024-05-23 19:12:07
429
原创 【Muduo】套接字:InetAddress、Socket
在 Muduo中,InetAddress和Socket是偏向底层的两个模块,封装了底层的一些系统调用,提供了好用的接口。
2024-05-23 18:52:00
425
原创 【Muduo】线程:Thread、EventLoopThread、EventLoopThreadPool
Muduo是 one loop per thread 模型的典范,其将EventLoop和thread封装成EventLoopThread,并且实现了一个简单的线程池来管理所有运行着loop的线程。
2024-05-23 18:34:49
548
原创 【Muduo】三大核心之EventLoop
当mainLoop接受到一个新的连接请求时,它会根据EventLoopThreadPool中的线程来选择一个subLoop,将新创建的TcpConnection的Channel放入这个subLoop中。每个subLoop都在一个独立的线程上运行,有一个用于唤醒自身的fd和Channel,运行一个Poller,并保存自己管理的多个Channel,以实现并发处理多个连接的目的。subLoop中的事件处理逻辑与mainLoop类似,也是通过Poller来监听fd上的事件,并调用相应的回调函数来处理这些事件。
2024-05-23 18:13:14
1038
原创 【Muduo】三大核心之Poller、EPollPoller
EPollPoller根据epoll_wait返回的文件描述符集合和事件类型,通过在epoll_event的data.ptr字段预先设置Channel对象的地址,从而能够找到对应的Channel对象,并调用其上的回调函数来处理事件。可以添加新的文件描述符、修改已注册的文件描述符的事件类型或删除已注册的文件描述符。:EPollPoller利用了epoll机制的高效性,能够同时监听大量的文件描述符,并且在有事件发生时只返回有事件发生的文件描述符集合,避免了轮询所有文件描述符的开销。
2024-05-23 17:36:53
2153
原创 【Muduo】三大核心之Channel
Muduo网络库的Channel模块是一个关键组件,它封装了文件描述符(fd)及其相关的事件,使得在TCP网络编程中能够利用IO多路复用技术(如epoll/poll)来监听和处理这些文件描述符上的事件。文件描述符(fd):每个Channel对象都对应一个特定的文件描述符,该文件描述符通常代表一个网络连接。感兴趣的事件(events):Channel对象封装了与文件描述符相关的一组感兴趣的事件,如可读、可写等。
2024-05-23 16:49:35
373
原创 C++项目在Linux下编译动态库
windows下开发的C++项目,在Linux下跨平台编译动态链接库,并设置ld.so.cache缓存文件,最终能够通过动态库链接进入其他项目中使用。
2024-04-24 17:39:27
1378
原创 SGI_STL和Nginx内存池源码剖析--源码移植
源码文件复杂,并且有很多项目中使用不到的宏定义,所以通过改写和移植,可以很好的适应C++的其他项目。将SGISTL内存配置器和Nginx内存池源码,移植到自己的项目中。
2024-04-16 21:34:29
237
原创 Nginx内存池相关源码剖析(六)外部资源释放和内存池销毁
destroy的释放顺序:1、通过回调函数链表,释放外部资源2、释放大块内存3、释放小块内存。
2024-04-16 17:00:07
404
原创 Nginx内存池相关源码剖析(五)重置函数ngx_reset_pool
当内存池中的内存不再需要时,或者当需要重用内存池时,可以使用函数来清理和重置内存池,以便后续再次使用。
2024-04-16 16:27:15
311
原创 Nginx内存池相关源码剖析(四)大块内存分配和释放逻辑
Nginx对于大块内存是调用系统的内存分配函数,然后将内存地址通过信息结构体进行管理。当Nginx不再需要一块大块内存时,它会调用操作系统的内存释放函数(如free)来将内存归还给操作系统。与分配过程类似,Nginx在释放大块内存时也不会进行额外的内存池管理操作。相反,它会依赖于操作系统的内存管理机制来自动处理内存碎片和回收工作。相对于小块内存的只有分配逻辑没有释放逻辑,大块内存两者都有。
2024-04-16 16:00:51
508
2
原创 Nginx内存池相关源码剖析(三)小块内存分配逻辑
Nginx内存池通过一种预分配和复用的方式来管理小块内存。值得注意的是,Nginx没有提供小块内存的释放和回收函数和任何逻辑。这是由Nginx的工作环境所决定的。
2024-04-16 15:43:38
607
原创 Nginx内存池相关源码剖析(二)ngx_create_pool创建函数
【代码】Nginx内存池相关源码剖析(二)ngx_create_pool创建函数。
2024-04-16 15:05:40
214
原创 Nginx内存池相关源码剖析(一)总览
Nginx内存池是Nginx为了优化内存管理而引入的一种机制。在Nginx中,每个层级(如模板、TCP连接、HTTP请求等)都会创建一个内存池进行内存管理。当这些层级的生命周期结束时,整个内存池会被销毁,将分配的内存一次性归还给操作系统。减少频繁的malloc和free操作:通过内存池,避免了频繁的动态内存申请和释放,从而降低了内存管理的开销。防止内存泄漏:内存池可以有效地避免因为申请未释放、二次释放或异常流程未释放而导致的内存泄漏问题。提高内存使用效率。
2024-04-16 14:50:24
676
1
原创 LPA3399Pro搭建Qt开发环境
Qt是一个跨平台的应用程序开发框架,支持多种操作系统和硬件架构,包括ARM架构的Linux。RK3399Pro是一款基于ARM架构的处理器,用于嵌入式系统。可以在RK3399上搭建Qt开发环境,进行项目开发。在ARM架构的Linux系统上安装Qt开发环境,大致需要以下几步:安装交叉编译工具链、下载Qt源代码、编译安装Qt源码。
2024-04-12 11:01:00
1209
原创 SGI_STL空间配置器源码剖析(五)_S_chunk_alloc函数、oom和优点
S_chunk_alloc函数源码剖析、oom处理和SGI STL二级空间配置器内存池的实现优点
2024-04-10 22:33:42
604
原创 SGI_STL空间配置器源码剖析(二)辅助接口函数
空间配置器有两个不容易理解的,但是很重要的辅助函数:_S_round_up和_S_freelist_index。
2024-04-10 21:43:06
348
原创 SGI_STL空间配置器源码剖析(一)总览
如下是SGI STL的stl_vector.h文件中,vector类相关的声明:上图展示了通过宏定义,vector 区分使用C++标准提供的内存分配器(allocator)还是使用SGI自己实现的空间配置器。# else# endif# endif从上面可以看到 __STL_DEFAULT_ALLOCATOR通过宏控制有两种实现,一种是,另一种是alloc,这两种分别就是SGI STL的一级空间配置器和二级空间配置器的实现。
2024-04-10 21:23:23
1036
原创 C++11 容器的emplace方法分析
经常在学习和开发中听到,vector要少用push_back()方法,而是用emplace_back()方法进行数据插入,会提高性能,但是具体的原理没有深入了解。今天深入了解并进行了源码剖析,在此记录下。
2024-04-02 21:06:16
1794
C++11容器emplace源码剖析
2024-04-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人