下面是《Linux 多线程入门:初识线程》教程内容,适用于刚接触 Linux 下多线程编程的开发者。
Linux 多线程:初识线程
📚 目录
- 什么是线程?
- 线程与进程的区别
- Linux 中的线程支持
- POSIX 线程库(pthread)
- 创建线程的基本方法
- 示例代码讲解
- 线程退出与回收
- 多线程编程注意事项
- 常见面试题回顾
- 学习延伸与参考资料
1️⃣ 什么是线程?
线程(Thread)是程序执行的最小单位,是比进程更小的执行流。一个进程在执行过程中可以包含多个线程,这些线程共享进程的资源(如内存、文件描述符等),但每个线程拥有自己的栈空间、程序计数器(PC)和寄存器环境。
2️⃣ 线程与进程的区别
特性 | 进程(Process) | 线程(Thread) |
---|---|---|
地址空间 | 独立地址空间 | 共享进程地址空间 |
通信方式 | 需要 IPC(管道、消息队列等) | 直接读写共享内存 |
创建/销毁开销 | 大,涉及系统资源 | 小,开销轻 |
崩溃影响范围 | 独立,不影响其他进程 | 同进程下其他线程可能受影响 |
3️⃣ Linux 中的线程支持
Linux 并不将线程视为“特殊实体”,而是通过 轻量级进程(LWP) 实现线程。它们之间共享地址空间,但调度器仍将每个线程视为独立的任务。
内核通过 clone()
系统调用创建线程,用户空间通过 pthread
(POSIX Threads)接口操作。
4️⃣ POSIX 线程库(pthread)
在 Linux 中,我们使用 pthread(POSIX Threads) 接口编写多线程程序。该库提供线程的创建、同步、终止等一整套接口,使用广泛,几乎所有 Linux 系统默认支持。
编译时需加上 -pthread
参数:
gcc thread.c -o thread -pthread
5️⃣ 创建线程的基本方法
函数原型:
#include <pthread.h>
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg);
参数说明:
thread
: 返回线程 IDattr
: 线程属性,传NULL
使用默认start_routine
: 线程入口函数arg
: 传给线程函数的参数
6️⃣ 示例代码讲解
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void* thread_func(void* arg) {
printf("Hello from thread! Received: %s\n", (char*)arg);
return NULL;
}
int main() {
pthread_t tid;
char* msg = "Thread argument";
if (pthread_create(&tid, NULL, thread_func, msg) != 0) {
perror("pthread_create failed");
return 1;
}
pthread_join(tid, NULL); // 等待线程结束
printf("Thread finished.\n");
return 0;
}
编译运行:
gcc thread.c -o thread -pthread
./thread
7️⃣ 线程退出与回收
pthread_exit()
:线程主动退出return
:从线程函数返回值pthread_join()
:主线程等待子线程结束pthread_detach()
:将线程分离,线程结束时资源自动释放
注意: 不 join 又不 detach 的线程,会造成资源泄漏(类似“僵尸线程”)。
8️⃣ 多线程编程注意事项
- ✅ 避免使用全局变量或保护它们(互斥锁)
- ✅ 同一资源需加锁,防止数据竞争(data race)
- ❌ 不要在线程退出后访问其栈变量
- ❌ 不建议在线程函数中
exit()
,这会终止整个进程
9️⃣ 常见面试题回顾
pthread_create
和fork()
有什么区别?- 为什么线程比进程“轻”?
- 如何避免线程间共享变量的竞争?
pthread_exit
与return
有何不同?- 线程池的核心原理是什么?
🔗 10. 学习延伸与参考资料(出站链接)
如果你想继续深入学习多线程内容,如线程同步(mutex、cond)、线程池实现、死锁问题、信号量等,请告诉我,我可以为你继续生成系列教程。
发表回复