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:输出参数,保存新创建线程的 IDpthread_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. 关键注意点:线程崩溃会导致整个进程退出,多线程操作共享资源必须加同步锁。
相关推荐
众少成多积小致巨6 小时前
Android 初始化语言入门
android·linux·c++
思麟呀6 小时前
在Select的基础上学习poll
linux·网络·学习·tcp/ip
喜欢吃燃面6 小时前
Linux 信号保存机制深度解析:从内核数据结构到进程状态管理
linux·运维·数据结构·学习
云边有个稻草人6 小时前
【Linux系统】第十节—【进程概念】环境变量 | 详解,包会!
linux·环境变量·命令行参数·环境变量的特性·获取linux环境变量的方法·环境变量path·通过代码获取linux环境变量
IMPYLH6 小时前
Linux 的 stdbuf 命令
linux·运维·服务器·bash
郝学胜-神的一滴6 小时前
从底层看透Linux高性能服务器:epoll自定义封装与超时清理实战
linux·服务器·c++·网络协议·tcp/ip·unix
keyipatience6 小时前
12.GDB调试技巧与计算机体系结构解析
linux·运维·服务器
小夏子_riotous6 小时前
Docker学习路径——9、Docker 网络深度解析:从默认网络到自定义网络实战
linux·运维·网络·docker·容器·centos·云计算
峥无6 小时前
《read/write的秘密:文件描述符、重定向与用户态缓冲区》
linux·运维·服务器·进程
fish_xk7 小时前
Linux操作系统
linux