C/C++
文章平均质量分 95
浅慕Antonio
分享编程知识
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【C++】C++11 实现可变参线程池
线程池是一种预先创建并复用线程的技术,用于解决频繁创建销毁线程带来的性能开销。其核心组件包括任务队列、工作线程、线程管理器、任务提交接口和拒绝策略。工作流程为:初始化线程池后,用户提交任务到队列,空闲线程取出任务执行,完成后继续等待新任务。实现上,使用std::function封装任务,支持超时检测和异步返回结果。线程池通过原子变量管理任务状态,确保线程安全,并支持异常处理和动态任务调度,有效提升系统资源利用率。原创 2025-08-23 16:07:09 · 790 阅读 · 0 评论 -
【C++】 C++11 std::bind和std::function
本文介绍了C++11中的两个重要工具:std::function和std::bind。std::function是一个通用的函数包装器,可以存储和调用各种可调用对象(函数、lambda、成员函数等),提供统一的接口来处理不同类型的可调用对象。std::bind用于绑定可调用对象的参数,通过占位符调整参数顺序或固定部分参数,生成新的可调用对象。文章对比了lambda表达式和std::bind的参数适配能力,说明它们在不同场景下的使用方式。这两个工具简化了函数传递、存储和延迟调用的过程,提高了代码的灵活性和复用原创 2025-08-20 11:44:08 · 715 阅读 · 0 评论 -
【C++】 C++11 智能指针
C++智能指针解析:shared_ptr的原理与应用 本文介绍了C++智能指针的概念,重点分析了shared_ptr的实现原理和使用方法。传统指针管理内存存在泄露风险,C++11引入智能指针简化内存管理。shared_ptr通过引用计数机制实现多指针共享同一内存对象,当最后一个指针销毁时自动释放内存。文章详细讲解了shared_ptr的初始化方式(优先使用make_shared)、引用计数变化、原始指针获取注意事项以及自定义删除器的用法。同时指出了常见使用误区,如避免用原始指针初始化多个shared_ptr原创 2025-08-19 11:46:04 · 1129 阅读 · 0 评论 -
【Linux】Linux静态库和动态库基础
静态库与动态库的概念及使用流程 静态库在编译阶段嵌入可执行文件,生成独立程序,文件后缀为.a。优点包括独立性强、启动速度快,缺点是体积大且更新麻烦。动态库则在运行时加载,后缀为.so,具有体积小、更新方便的优点,但依赖环境且启动稍慢。 静态库制作流程:1) 编译源文件为.o;2) 用ar工具打包为.a文件;3) 发布库文件和头文件。使用时需指定头文件路径(-I)和库路径(-L)。动态库制作类似,但需-fPIC编译,使用ldconfig或环境变量配置路径。 关键区别: 静态库:编译时链接,独立性强 动态库:运原创 2025-06-18 00:50:20 · 1439 阅读 · 0 评论 -
【Linux】Linux 线程池基础
本文介绍了线程池的概念、优点和应用场景,并实现了一个简单的线程池。线程池通过预先创建一定数量的线程,避免了频繁创建销毁线程的开销,提高了系统性能。其优点包括快速响应任务、防止系统过载和资源占用较少。线程池适用于短时任务量大或对性能要求高的场景。文章通过C++代码实现了线程池的核心功能,包括任务队列管理、线程同步机制等,并展示了线程池处理数学计算任务的运行效果。该实现使用了互斥锁和条件变量确保线程安全,通过模板设计提高了代码复用性。原创 2025-06-17 16:09:21 · 747 阅读 · 0 评论 -
【Linux】Linux异步I/O -libaio
libaio是Linux内核提供的异步I/O库,通过io_submit提交请求后立即返回,内核通过完成队列通知结果。其核心特性包括零拷贝(结合O_DIRECT绕过内核缓冲区)和批量处理。使用O_DIRECT时需注意数据对齐要求,适合数据库等大文件连续I/O场景。主要API包括:io_setup创建上下文、io_submit提交请求、io_getevents获取完成事件,以及io_prep_pread/pwrite准备读写请求。libaio通过异步机制显著提升I/O性能,特别适合高并发存储应用。原创 2025-06-17 13:14:20 · 1971 阅读 · 0 评论 -
【Linux】Linux异步I/O- POSIX glibc
本文介绍了异步I/O的概念及其实现方式。异步I/O允许应用程序发起请求后立即返回,由系统后台处理IO操作,完成后通过回调或信号通知,相比同步I/O具有高并发和资源利用率优势。文章重点分析了glibc对POSIX AIO标准的实现,包括关键函数如aio_read、aio_write等,以及核心数据结构aiocb和sigevent。glibc通过线程池模拟异步I/O,本质仍是多线程同步I/O,性能较低。文章还对比了Linux系统中不同的异步I/O实现方案(如libaio、io_uring)及其他操作系统的异步接原创 2025-06-16 21:03:40 · 1205 阅读 · 0 评论 -
【Linux】Linux 信号驱动I/O
信号驱动I/O是一种同步I/O模型,通过内核发送SIGIO信号通知进程文件描述符就绪,实现非阻塞的事件通知。其核心流程包括:注册兴趣和信号处理函数、异步通知、事件处理。虽然通知阶段是非阻塞的,但数据拷贝阶段仍需阻塞式系统调用,因此本质上属于同步I/O。实现时需通过fcntl设置O_ASYNC标志和进程属主,并使用sigaction注册SIGIO处理函数。示例代码展示了基于信号驱动的TCP服务端实现,其中listen_fd设置为信号驱动模式,新连接到来时会触发信号处理函数进行accept操作。该模型适合需要高原创 2025-06-15 16:52:35 · 1023 阅读 · 0 评论 -
【Linux】Linux多路复用-epoll
epoll是Linux高效I/O多路复用机制,通过epoll_create创建内核事件表(含红黑树和就绪队列),epoll_ctl注册/修改/删除监控事件,epoll_wait获取就绪事件。其核心优势在于:1)红黑树存储监控的FD,增删改查高效;2)回调机制将就绪事件自动加入就绪队列;3)仅返回就绪事件,避免遍历所有FD。相比select/poll,epoll更适合高并发场景,是高性能服务器的关键技术。原创 2025-06-14 17:53:38 · 978 阅读 · 0 评论 -
【Linux】Linux多路复用-poll
摘要 Poll是Unix/Linux系统中的多路IO复用机制,用于监控多个文件描述符的状态变化(可读、可写等)。它通过pollfd结构体(包含fd、events、revents)管理文件描述符。核心函数poll(fds[], nfds, timeout)可设置超时时间并返回就绪的fd数量。Poll服务器的工作流程包括:创建监听套接字、初始化pollfd数组、持续检测事件(新连接或数据读取)、处理就绪事件(accept新连接或读取数据)。相较于select,poll不需要每次重新设置fd,提高了效率。文章还提原创 2025-06-14 14:26:41 · 1145 阅读 · 0 评论 -
【Linux】Linux 多路复用-select
摘要:多路复用技术(如select)允许单线程高效监控多个I/O通道,解决了传统网络编程中多线程资源消耗大或轮询浪费CPU的问题。select通过内核监控文件描述符集合,在事件发生时通知程序处理。其工作流程包括设置描述符集合、调用select等待事件、处理就绪事件并更新集合。文章详细解析了select函数参数、文件描述符就绪条件,并提供了基于select的服务器实现思路。该技术显著提升了网络服务器的并发处理能力,适合高负载场景。原创 2025-06-14 00:17:57 · 1067 阅读 · 0 评论 -
【Linux】Linux基础I/O
本文介绍了C语言和系统文件I/O操作的基本接口。C语言提供了fopen、fclose、fwrite等系列函数进行文件读写,并以二进制或文本形式操作数据。系统调用层面则通过open、close、write、read等函数实现底层文件操作,其中open返回的文件描述符从3开始依次递增。文章通过具体代码示例,演示了如何创建文件、读写内容以及关闭文件,并解释了文件描述符与标准输入输出的关系,说明用户程序必须通过操作系统才能访问硬件文件。原创 2025-06-12 12:03:13 · 1234 阅读 · 0 评论 -
【Linux】Makefile基础
Makefile是自动化构建C/C++项目的工具,通过定义规则管理编译过程。其核心由目标、依赖和命令组成,基本语法为target: dependencies [tab] command。工作原理是根据文件时间戳判断是否需要重建目标。支持变量定义(如CC=g++)和内置变量($@表示目标文件名)。伪目标(.PHONY)用于执行非文件操作(如clean)。示例展示了从直接编译到使用变量、模式匹配的进阶写法,最终提供一个完整的Makefile模板,包含编译器设置、源文件列表和目标生成规则,实现自动化构建可执行程序原创 2025-06-11 16:42:39 · 1206 阅读 · 0 评论 -
【Linux】Linux进程间通讯-共享内存
要使用一块共享内存,进程必须首先分配它。随后需要访问这个共享内存块的每一个进程都必须将这个共享内存绑定到自己的地址空间中。在 Linux 系统中,每个进程的虚拟内存是被分为许多页面的。这些内存页面中包含了实际的数据。每个进程都会维护一个从内存地址到虚拟内存页面之间的映射关系。尽管每个进程都有自己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的。分配一个新的共享内存块会创建新的内存页面。原创 2025-06-07 15:06:48 · 1172 阅读 · 0 评论 -
【Linux】Linux 进程间通讯-管道
进程间通信(IPC)是实现不同进程间数据共享和同步的重要手段。文章介绍了IPC的基本概念、目的和分类,重点讲解了匿名管道的实现原理和使用方法。管道通过内核缓冲区实现单向数据传输,适用于父子进程通信,具有流式传输、同步互斥等特点。示例代码展示了如何使用pipe和fork函数建立父子进程间的管道通信,并分析了字节流通信的特性。管道通信随进程退出而释放,需注意读写端的关闭时机和双向通信的建立方式。原创 2025-06-06 23:51:06 · 1477 阅读 · 0 评论 -
【Linux】 Linux 进程控制
摘要: 本文详细介绍了Linux进程管理中的关键概念和操作。主要内容包括: 进程创建:重点讲解fork()函数的工作原理、返回值机制和写时拷贝技术,分析父子进程的执行流程。 进程终止:阐述进程退出的三种场景,介绍退出码的作用及查询方法,对比return、exit()和_exit()三种退出方式的区别。 进程等待:说明父进程等待子进程的必要性,演示wait()和waitpid()两种等待方法的使用,展示如何防止僵尸进程的产生。 文章通过代码示例和运行结果直观展示了进程创建、终止和等待的全过程,并提供了监控进程原创 2025-06-05 23:42:22 · 1216 阅读 · 0 评论 -
【Linux】Linux 环境变量
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。原创 2025-06-04 19:20:27 · 1268 阅读 · 0 评论 -
【Linux】Linux 进程基础
在时间片轮转调度算法中,系统根据先来先服务的原则,将所有的就绪进程排成一个就绪队列,并且每隔一段时间产生一次中断,激活系统中的进程调度程序,完成一次处理机调度,把处理机分配给就绪队列队首进程,让其执行指令。从上述的结果可以看出,main函数的进程和fork创建的进程打印的结果是一样的,并且通过pid和ppid发现,fork的父进程就是main函数的进程,说明fork所创建出来的子进程和父进程在内存上映射。进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。原创 2025-06-03 22:56:08 · 1152 阅读 · 0 评论 -
【Linux】pthread多线程同步
线程同步与互斥锁机制 本文介绍了线程同步的核心概念和互斥锁的应用。线程共享全局变量时可能引发数据安全问题,临界区的原子操作需要通过同步机制保证。互斥锁(mutex)是最常用的同步工具,通过锁定和解锁操作确保同一时间只有一个线程访问共享资源。文章详细解析了互斥锁的5个关键API函数:初始化(pthread_mutex_init)、加锁(pthread_mutex_lock/pthread_mutex_trylock)、解锁(pthread_mutex_unlock)和销毁(pthread_mutex_dest原创 2025-06-03 01:00:27 · 966 阅读 · 0 评论 -
【Linux】pthread多线程基础
线程概述与创建 线程是轻量级进程,允许应用程序并发执行多个任务。一个进程包含多个线程,所有线程共享全局内存区域(如数据段、堆内存),但拥有独立的栈空间。线程比进程创建更快,资源消耗更少,适合高效并发处理。在Linux中,线程本质仍是进程,可通过ps -Lf pid查看线程ID。 线程与进程的主要区别在于: 资源共享:线程共享内存,通信更便捷;进程需通过IPC机制。 创建开销:线程创建无需复制内存和页表,速度更快。 创建线程使用pthread_create(),需指定线程函数和参数。线程终止方式包括:主动调用原创 2025-06-02 20:36:51 · 1082 阅读 · 0 评论 -
【C++】C/C++中的类型转换
在 C 语言里,隐式转换是编译器自动进行的类型转换操作,不需要程序员手动干预。原创 2025-02-26 00:34:27 · 1248 阅读 · 0 评论
分享