Linux——线程

一、Linux 中线程的核心概念

首先,先明确 Linux 下线程的特殊之处:

  • 在 Linux 内核层面,并没有真正意义上的 "线程" 结构 ,Linux 把所有执行流(进程 / 线程)都统一称为 轻量级进程(LWP, Light Weight Process)。
  • 我们平时说的 "线程",本质是共享同一地址空间的多个 LWP(共享内存、文件描述符、信号处理等资源)。
  • 线程的优势:创建 / 切换开销远小于进程,通信成本极低(直接读写全局变量),但稳定性差(一个线程崩溃会导致整个进程退出)。

二、Linux 线程核心函数(pthread 库)

Linux 操作线程的函数都在 pthread 库中,编译时必须加 -lpthread 链接库

(例如:gcc test.c -o test -lpthread)。

1. 线程创建:pthread_create()

功能:创建一个新的线程,执行指定的函数。

函数原型:

复制代码
#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);

参数解释:

  • thread:输出参数,保存新创建线程的 ID (pthread_t 类型)。
  • attr:线程属性(优先级、栈大小等),一般传 NULL 使用默认属性。
  • start_routine:线程要执行的函数指针(函数格式必须是 void* 函数名(void*))。
  • arg:传给线程函数的参数(无类型指针,可传任意数据,需自己做类型转换)。

返回值:成功返回 0,失败返回错误码(Linux 系统调用一般返回 -1,但 pthread 函数直接返回错误码)。

2. 线程等待:pthread_join()

功能 :阻塞等待指定线程退出,并回收线程资源(类似进程的 wait()),避免 "僵尸线程"。

函数原型:

复制代码
int pthread_join(pthread_t thread, void **retval);

参数解释:

  • thread:要等待的线程 ID。
  • retval:输出参数,保存线程退出时的返回值(即 start_routine 函数的返回值),不需要则传 NULL。

返回值:成功返回 0,失败返回错误码。

3. 线程退出:pthread_exit()

功能 :主动终止当前线程,且不会影响同进程的其他线程(区别于 exit(),exit() 会终止整个进程)。

函数原型:

复制代码
void pthread_exit(void *retval);

参数 :retval:线程退出的返回值,可被 pthread_join() 获取。

4. 线程分离:pthread_detach()

功能 :将线程设置为 "分离态",线程退出时会自动回收资源,无需主线程调用 pthread_join()。适用场景:主线程不关心子线程的退出状态,不想阻塞等待。

函数原型:

复制代码
int pthread_detach(pthread_t thread);
5. 获取线程 ID:pthread_self()

功能:获取当前线程的 ID(区别于内核的 LWP ID)。

函数原型:

复制代码
pthread_t pthread_self(void);
6. 线程取消:pthread_cancel()

功能:向指定线程发送 "取消请求",让线程退出(需线程处于可取消状态)。

函数原型:

复制代码
int pthread_cancel(pthread_t thread);

三、线程同步

线程共享进程资源,多线程操作同一变量时会出现 "竞态条件"(数据错乱),必须通过同步机制解决,核心函数:

  1. 互斥锁(pthread_mutex_t) :
    • pthread_mutex_init():初始化互斥锁
    • pthread_mutex_lock():加锁(阻塞)
    • pthread_mutex_unlock():解锁
    • pthread_mutex_destroy():销毁互斥锁
  2. 条件变量(pthread_cond_t):解决 "等待 - 唤醒" 场景(如生产者 - 消费者模型)。

四、总结

  1. Linux 线程本质:是共享地址空间的轻量级进程(LWP),无独立资源,仅共享进程资源。
  2. 核心函数 :
    • 创建:pthread_create()(编译加 -lpthread)
    • 等待:pthread_join()(回收资源,避免僵尸线程)
    • 退出:pthread_exit()(仅终止当前线程)
    • 同步:互斥锁(pthread_mutex_*)解决多线程数据竞争。
  3. 关键注意点:线程崩溃会导致整个进程退出,多线程操作共享资源必须加同步锁。
相关推荐
琥珀.2 小时前
mysql中json数组转列表查询
linux·运维·服务器
dawnsky.liu3 小时前
在 RHEL 中使用 goose 实现远程主机管理
linux·运维·ai
Linux运维技术栈4 小时前
CVE-2026-91403 高危漏洞修复:Rocky Linux 9 多版本 JDK 环境清理实操
java·linux·运维
slongzhang_6 小时前
linux 递归删除源码文件|递归删除目录下 *.js,但排除 *.min.js
linux·开发语言·javascript
叼烟扛炮6 小时前
Linux 学习笔记(三十三):线程互斥——互斥锁(Mutex)与死锁
linux·运维·服务器·笔记·学习·1024程序员节
无足鸟ICT6 小时前
【RHCA+】who命令(查看已登陆用户)
linux·运维·服务器
Escalating_xu7 小时前
【Linux 网络编程】应用层协议 HTTP(下):Header、连接管理与 C++ HTTP 服务器
linux·服务器·网络
GeW9 小时前
新质生产力路线图落地,Linux运维与数据库架构师的机会清单
linux
Brilliantwxx9 小时前
【Linux】 文件访问与路径解析:目录、文件名、dentry、路径缓冲与 dcache 全解析
linux·运维·服务器·开发语言·spring
father_122710 小时前
Greenplum 集群故障恢复与主备同步机制实战
linux·网络·greenplum