自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

原创 Linux 无名管道 & 有名管道(FIFO)超详细讲解

管道是 Linux 最经典的进程间通信 IPC无名管道(匿名管道 pipe)有名管道(命名管道 FIFO)很多初学者分不清:什么时候用无名管道?什么时候用有名管道?区别在哪、怎么用、适用场景是什么?这篇一次性讲透,带原理 + 特点 + 代码实战。无名管道是Linux 内核开辟的一块内存缓冲区,没有实体文件、没有文件名,只存在于内存中。有名管道也叫FIFO,是存在于磁盘上的特殊文件,类型标识为p。有文件名、有路径,任何进程都可以通过路径打开通信。无名管道:无文件、只血缘进程、随进程销毁,简单轻量;

2026-05-07 15:01:46 39

原创 Linux 信号量详解:原理、API 与实战

初始值设为0等待线程执行sem_wait→ 阻塞唤醒线程执行sem_post→ 解除阻塞忘记初始化信号量,直接使用导致崩溃信号量初始值设置错误(同步场景误设为 1)sem_wait和sem_post不配对,导致死锁多线程访问共享资源时,忘记加互斥信号量程序结束后未销毁信号量信号量是 Linux 并发编程的全能同步工具初始值 = 1 → 替代互斥锁初始值 = 0 → 实现线程同步初始值 = N → 控制最大并发数。

2026-04-22 20:06:27 335

原创 深入理解 Linux 条件变量:从原理到实战

单独使用条件变量,不配合互斥锁用 if 而非 while 判断条件,导致虚假唤醒问题修改条件前未加锁唤醒后未重新判断条件直接执行忘记销毁条件变量与互斥锁条件变量是 Linux 多线程同步的核心工具,完美解决了线程间等待与唤醒的问题,大幅降低 CPU 占用。使用时牢记与互斥锁绑定、while 判断、先改条件再唤醒三大原则,就能安全高效地实现生产者 - 消费者、线程池等经典并发模型。

2026-04-22 20:00:21 193

原创 深入理解自旋锁:忙等背后的高效同步之道

自旋锁是 “短耗时临界区” 的最优解,它通过 “忙等” 的方式,避免了线程上下文切换的开销,在锁持有时间极短、多处理器系统的场景下,比互斥锁、读写锁更高效。它不是 “替代” 互斥锁、读写锁,而是 “补充”—— 不同的锁有不同的适用场景,没有最好的锁,只有最适合的锁。锁持有时间短,用自旋锁;锁持有时间长,用互斥锁;读多写少,用读写锁。

2026-04-21 15:23:31 298

原创 深入理解读写锁:为什么读操作也需要加锁?

读写锁是 “读多写少” 场景下的性能最优解,它通过 “读共享、写独占” 的机制,既保证了共享资源的安全性(避免脏读、数据混乱),又最大化了读操作的并发效率,解决了互斥锁串行读的性能瓶颈。而读锁的存在,不是多余的,而是为了协调读与写的关系 —— 它保护的不是读操作本身,而是读操作的正确性,避免读线程拿到写操作过程中的 “半成品” 数据,同时防止写操作被读操作打断。结合你之前的代码,我们可以做一个简单的改造:把互斥锁换成读写锁,让 5 个读线程并发执行,就能明显看到性能的提升。

2026-04-21 15:07:43 321

原创 数据结构入门:顺序表与链表的核心解析及实战对比

线性表的核心定义是 “数据元素按线性顺序排列,每个元素有唯一的前驱和后继(除了首尾元素)”,而顺序表和链表的本质区别,在于 数据的存储方式和访问方式不同。结合前面的分析,我们再梳理一下两者的优缺点,帮你快速判断场景。

2026-04-19 11:40:14 177

原创 Linux 编程|条件变量与互斥锁:核心区别与正确搭配指南

互斥锁管 “资源安全”,条件变量管 “线程同步”,二者职责不同,缺一不可;条件变量不能单独使用,必须与互斥锁配合,否则会出现信号丢失、条件竞争等问题;避免用互斥锁 + 忙等代替条件变量,否则会浪费 CPU 资源,降低程序效率。其实条件变量和互斥锁的搭配,本质是 “分工合作”—— 互斥锁保证 “操作安全”,条件变量保证 “执行高效”,二者结合,才能写出既安全又高效的多线程代码。

2026-04-17 14:47:56 418

原创 深入理解原子操作与互斥锁:并发编程的核心基石

原子(Atomic)的本意是 “不可再分割”。CPU 保证整个操作从开始到结束,一步到位,不会被任何其他线程打断。它是硬件 / 指令集层面提供的最小执行单元,全程无中断、无切换。还是上面的count++例子:如果用原子操作实现,CPU 会把 “读 + 改 + 写” 打包成一个整体,要么全部执行完,要么完全不执行,绝对不会被其他线程打断。最终两个线程执行后,count一定等于 2,完全正确。原子操作只能解决简单变量问题,但如果我们需要执行一段复杂代码。

2026-04-13 16:22:48 307

原创 Linux Nice 值详解:普通线程 CPU 分配的 “谦让法则”

Nice 值是普通线程(SCHED_OTHER)的 “谦让值”,不是优先级,优先级固定为 0;取值范围 - 20~19,越小越霸道,CPU 分配越多,负 Nice 值需 root 权限;实时线程(FIFO/RR)不受 Nice 值影响,实时优先级(1~99)永远高于普通线程;3 种设置方式:命令行 nice、renice 修改运行中进程、代码中 nice () 函数;核心用途:调节普通线程 CPU 分配比例,优化系统性能和任务响应速度。

2026-04-13 16:20:07 337

原创 Linux 线程调度策略详解:SCHED_OTHER、SCHED_FIFO、SCHED_RR

sleep、printf、锁、IO 都会阻塞线程并释放 CPU,会让低优先级线程获得运行机会。多核 CPU上不同核心可同时运行不同优先级线程,想观察抢占必须绑核。SCHED_FIFO 同优先级:谁先运行谁独占,另一个线程完全不运行。SCHED_RR 同优先级:轮流运行,自动切换,公平不卡死。实时线程必须使用root权限运行。

2026-04-10 16:54:51 220

原创 孤儿进程与僵尸进程(超详细解析 + 代码演示)

父进程先退出,子进程还在运行,此时子进程就变成了孤儿进程。操作系统会自动将孤儿进程的父进程「过继」给init进程(PID=1),由 init 进程完成后续的资源回收。子进程已经退出,父进程没有调用wait()waitpid()回收子进程的 PCB 资源,此时子进程就变成了僵尸进程。孤儿进程:父死子活 → 被 init 收养 → 安全无害。僵尸进程:子死父不回收 → 残留资源 → 有害,必须避免。父进程的核心责任:子进程退出后,必须调用wait()waitpid()回收资源,避免产生僵尸进程。

2026-04-10 15:50:52 195

原创 深入理解 C 语言内存布局:从栈到堆,一文讲透程序内存分配

表格分区分配方式生命周期读写权限管理方式典型问题代码区编译后分配整个程序运行期只读系统管理无全局 / 静态区编译后分配整个程序运行期读写系统管理无常量区编译后分配整个程序运行期只读系统管理非法修改崩溃栈区自动分配 / 释放函数 / 代码块内读写系统自动管理栈溢出堆区手动申请 / 释放手动释放前一直存在读写开发者手动管理内存泄漏、野指针栈区自动管,堆区手动管:栈区省心但空间小,堆区灵活但必须自己释放全局 / 静态变量常驻内存。

2026-04-08 17:57:31 410

原创 进程与线程的核心区别:一篇看懂,告别混淆

看完了所有区别,最后给大家一个实用的选择建议,结合编程场景快速判断:同一任务的多个子任务并行,需要共享资源,追求高效通信和低开销。比如:浏览器多标签、视频播放器的播放与下载、程序中的多任务处理(如同时计算和打印)。多个独立任务,需要资源隔离,避免一个任务崩溃影响其他任务。比如:操作系统同时运行微信、浏览器、VS Code,每个应用都是一个独立进程;或者需要多任务并行,且每个任务需要独立的内存空间。对于我们编程学习者来说,接触最多的是多线程。

2026-04-08 17:01:47 388

原创 Qt 三大窗口基类(QMainWindow、QWidget、QDialog)彻底搞懂

是主窗口专属,自带完整框架,适合完整应用QWidget是万能容器,灵活度最高,适合自定义 / 极简场景QDialog是弹窗专用,支持模态交互,适合临时交互界面。

2026-04-01 16:51:51 377

原创 一文搞懂:open / fopen / popen 的本质区别与选型指南

摘要: Linux C开发中,文件操作的三个核心接口open、fopen、popen各有特点: open:POSIX系统调用,直接操作文件描述符,无缓冲,适合底层控制(如设备文件、非阻塞I/O); fopen:C标准库封装,带缓冲的文件指针,支持格式化读写,跨平台性好,适用于常规文件操作; popen:通过管道执行Shell命令,实现进程通信,需用pclose关闭。 选型建议: 精细控制或特殊文件用open; 常规文件读写用fopen; 执行外部命令用popen。 注意避免混用关闭函数及缓冲问题。

2026-03-31 20:24:33 375

原创 Linux 下 C 语言文件操作:从系统调用到实现 cp 命令

忘记检查系统调用返回值openreadwriteclose都可能失败,不检查返回值会导致程序逻辑异常,甚至数据丢失。创建文件时忘记指定mode:会导致文件权限异常(比如没有读权限),后续操作失败。缓冲区未初始化read读取的数据不一定是字符串,缓冲区如果没有清空,可能会有垃圾数据。write返回值不等于count:比如写入管道、网络套接字时,write可能只写了部分数据,必须循环写入直到全部完成。文件描述符泄漏open后忘记close,会导致进程打开的文件数超过系统限制,后续open失败。

2026-03-31 20:15:29 545

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除