当前位置: 首页 > news >正文

Linux多线程

Linux 多线程 口语化全面讲解

Linux 里的多线程,简单说就是让一个程序同时干好几件事 —— 比如一个视频播放器,主线程负责显示画面,子线程负责加载音频、读取本地文件,不用等一个任务做完再做下一个,效率直接拉满。Linux 下开发多线程主要用POSIX 线程库(pthread 库),这是最基础也最核心的工具,新手先吃透这个就够了。

一、核心基础:线程的创建与退出(新手必学)

1. 最核心的代码模板(直接能用)

先看一个最简单的多线程例子,主线程创建 1 个子线程,各自打印内容:
c
 
运行
 
 
 
 
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>// 子线程要执行的函数(参数和返回值必须是void*,这是pthread的规定)
void* thread_func(void* arg) {int num = *(int*)arg; // 接收主线程传过来的参数for (int i = 0; i < 5; i++) {printf("子线程 %d 运行中:%d\n", num, i);sleep(1); // 暂停1秒,模拟干活}pthread_exit(NULL); // 子线程退出
}int main() {pthread_t tid; // 定义线程ID,用来标识子线程int arg = 100; // 要传给子线程的参数// 1. 创建子线程:参数依次是线程ID、线程属性(NULL用默认)、要执行的函数、传给函数的参数int ret = pthread_create(&tid, NULL, thread_func, (void*)&arg);if (ret != 0) {perror("创建线程失败"); // 出错了就打印原因return -1;}// 主线程自己的逻辑for (int i = 0; i < 3; i++) {printf("主线程运行中:%d\n", i);sleep(1);}// 2. 等待子线程结束(如果不加这个,主线程先退出,子线程可能被强制终止)pthread_join(tid, NULL);printf("所有线程执行完毕\n");return 0;
}
 

2. 编译与运行(关键步骤)

Linux 下编译多线程代码必须加 -lpthread 链接线程库,否则会报错:
bash
 
运行
 
 
 
 
# 编译命令:gcc 文件名.c -o 可执行文件名 -lpthread
gcc thread_demo.c -o thread_demo -lpthread
# 运行
./thread_demo
 

3. 核心函数解释(新手记牢)

函数 作用 关键说明
pthread_create() 创建线程 必须检查返回值,创建失败会返回非 0
pthread_join() 等待线程结束 主线程会阻塞,直到子线程执行完
pthread_exit() 线程主动退出 子线程用完记得退出,避免内存泄漏
pthread_detach() 分离线程 子线程结束后自动释放资源,不用主线程等(二选一:join 或 detach)

二、核心痛点:线程同步(避免 “抢资源”)

多线程最容易踩的坑是「资源竞争」—— 比如两个线程同时修改同一个变量,结果会乱掉。解决这个问题靠互斥锁(mutex),简单说就是 “先到先得,用完解锁”。

互斥锁实战例子(解决变量竞争)

c
 
运行
 
 
 
 
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>int count = 0; // 共享变量
pthread_mutex_t mutex; // 定义互斥锁void* add_count(void* arg) {for (int i = 0; i < 10000; i++) {pthread_mutex_lock(&mutex); // 加锁:只有一个线程能进来count++; // 操作共享变量pthread_mutex_unlock(&mutex); // 解锁:其他线程才能进}return NULL;
}int main() {pthread_t tid1, tid2;// 初始化互斥锁(默认属性用NULL)pthread_mutex_init(&mutex, NULL);// 创建两个线程,都去加countpthread_create(&tid1, NULL, add_count, NULL);pthread_create(&tid2, NULL, add_count, NULL);// 等两个线程结束pthread_join(tid1, NULL);pthread_join(tid2, NULL);printf("最终count值:%d\n", count); // 加锁后结果是20000,不加锁会随机(比如18999)pthread_mutex_destroy(&mutex); // 销毁锁,释放资源return 0;
}
 

其他同步方式(了解即可)

  • 条件变量(pthread_cond_t):让线程 “等条件满足再执行”(比如等数据准备好);
  • 信号量(sem_t):控制同时访问资源的线程数量(比如最多 3 个线程读文件)。

三、新手避坑点(关键!)

  1. 编译必须加 - lpthread:这是最常见的新手错误,不加会提示 “未定义的引用”;
  2. 共享变量要同步:只要多个线程改同一个变量,必须加锁,否则结果随机;
  3. 主线程别提前退出:如果主线程不调用 pthread_join,直接 exit,所有子线程都会被杀死;
  4. 避免线程死锁:加锁顺序要一致(比如线程 1 先锁 A 再锁 B,线程 2 也必须先 A 后 B),不然会互相等对方解锁;
  5. 资源要释放:互斥锁、条件变量用完要销毁,线程退出要清理。

四、实际应用场景

  1. 服务器开发:比如 Web 服务器,一个主线程监听端口,收到请求就创建子线程处理,同时响应多个客户端;
  2. 数据处理:比如批量解析日志,多线程同时解析不同文件,提速几倍;
  3. 实时监控:主线程显示界面,子线程定时读取 CPU、内存状态,不卡界面;
  4. 多媒体处理:视频解码、音频播放,多线程分工处理不同流。

3 类吸睛标题(适合笔记 / 分享)

硬核技术风

  1. Linux 多线程实战:从创建到同步,pthread 库手把手教
  2. 吃透 Linux 线程同步:互斥锁解决资源竞争的核心逻辑
  3. Linux 多线程避坑指南:新手必看的 5 个关键知识点

简洁吸睛风

  1. Linux 多线程:让程序同时干多件事的核心玩法
  2. 一文搞懂 pthread 库,Linux 多线程入门就会
  3. Linux 多线程:互斥锁是解决资源竞争的关键

场景痛点风

  1. 多线程改变量结果乱?Linux 互斥锁一招搞定
  2. 主线程退出子线程就死?pthread_join 帮你解决
  3. Linux 编译多线程代码报错?少了 - lpthread!

总结

  1. Linux 多线程核心用pthread 库,编译必须加 -lpthread,核心函数是创建(pthread_create)、等待(pthread_join)、退出(pthread_exit);
  2. 多线程最大坑是资源竞争,用互斥锁(mutex)加锁 / 解锁就能解决;
  3. 新手先练基础创建,再吃透互斥锁,避开 “提前退出、忘记加锁、编译漏参数” 这三个坑。
http://www.rkmt.cn/news/158792.html

相关文章:

  • 4269-02-160000印刷电路板
  • 企业邮箱系统哪个好?2025年企业邮箱系统对比与推荐 - U-Mail邮件系统
  • 别再换手机了!1个隐藏方法让旧手机秒变Open-AutoGLM AI终端
  • 大模型“内卷“新方向:密度定律揭秘,小模型逆袭,开发者如何应对AI成本变革?
  • Python DataFrame详解:创建、操作与空值处理
  • Open-AutoGLM安装卡在最后一步?90%人忽略的关键配置曝光
  • FastAPI学习
  • 鸿蒙生态下的形态:读懂华为2025年产品线的三个关键词
  • 基于深度置信网络(DBN)的数据回归预测之旅
  • 【AI】SWOT分析法
  • 手机部署Open-AutoGLM难吗?掌握这6个技术要点,轻松实现离线推理
  • Open-AutoGLM插件性能实测对比:比传统AutoGLM快3.8倍的背后真相
  • 逆向解密WebShell源码全过程
  • 2025连接器超声波焊接机厂家推荐:新能源超声波焊接机/汽车配件超声波焊接机/继电器超声波焊接机源头厂家精选 - 品牌推荐官
  • XR开发随笔(RhinoX Pro)
  • Open-AutoGLM本地部署性能翻倍秘诀:CUDA、TensorRT协同优化实战
  • 研发周期缩短 60%!电鱼智能 RK3588“核心板+底板”模式助推渔具产品极速定制
  • PI技术路径转向human data?澄清和解读
  • 2025年舆情分析报告平台怎么选?蜜度旗下的新浪舆情通好用吗 - 深度智识库
  • Open-AutoGLM能跑在虚拟机上吗:5大关键配置决定成败
  • 基于PLC的双层立体车库电气控制系统设计
  • 2025 智能垂钓选型:为何高端视觉渔具首选 电鱼智能 RK3588?
  • 城乡差距下的乡村变迁之路
  • 安卓用户必看:Open-AutoGLM安装失败?这7个坑你一定要避开
  • 显卡性能设置指南:解决游戏卡顿掉帧问题
  • 前端面试题:如何减少页面重绘跟重排
  • 杂题选做-11
  • 整理了一些高质量的技术社区和资源论坛
  • 深入浅出冒泡排序:原理、实现与优化(附C++代码)
  • 软文发稿平台权威榜单出炉:从价格到效果全维度分析 - 资讯焦点