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);
// 创建两个线程,都去加count
pthread_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 个线程读文件)。
三、新手避坑点(关键!)
- 编译必须加 - lpthread:这是最常见的新手错误,不加会提示 “未定义的引用”;
- 共享变量要同步:只要多个线程改同一个变量,必须加锁,否则结果随机;
- 主线程别提前退出:如果主线程不调用 pthread_join,直接 exit,所有子线程都会被杀死;
- 避免线程死锁:加锁顺序要一致(比如线程 1 先锁 A 再锁 B,线程 2 也必须先 A 后 B),不然会互相等对方解锁;
- 资源要释放:互斥锁、条件变量用完要销毁,线程退出要清理。
四、实际应用场景
- 服务器开发:比如 Web 服务器,一个主线程监听端口,收到请求就创建子线程处理,同时响应多个客户端;
- 数据处理:比如批量解析日志,多线程同时解析不同文件,提速几倍;
- 实时监控:主线程显示界面,子线程定时读取 CPU、内存状态,不卡界面;
- 多媒体处理:视频解码、音频播放,多线程分工处理不同流。
3 类吸睛标题(适合笔记 / 分享)
硬核技术风
- Linux 多线程实战:从创建到同步,pthread 库手把手教
- 吃透 Linux 线程同步:互斥锁解决资源竞争的核心逻辑
- Linux 多线程避坑指南:新手必看的 5 个关键知识点
简洁吸睛风
- Linux 多线程:让程序同时干多件事的核心玩法
- 一文搞懂 pthread 库,Linux 多线程入门就会
- Linux 多线程:互斥锁是解决资源竞争的关键
场景痛点风
- 多线程改变量结果乱?Linux 互斥锁一招搞定
- 主线程退出子线程就死?pthread_join 帮你解决
- Linux 编译多线程代码报错?少了 - lpthread!
总结
- Linux 多线程核心用pthread 库,编译必须加
-lpthread,核心函数是创建(pthread_create)、等待(pthread_join)、退出(pthread_exit); - 多线程最大坑是资源竞争,用互斥锁(mutex)加锁 / 解锁就能解决;
- 新手先练基础创建,再吃透互斥锁,避开 “提前退出、忘记加锁、编译漏参数” 这三个坑。

浙公网安备 33010602011771号