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

Linux线程机制

Linux 操作系统中的线程机制是基于 POSIX 线程(Pthreads) 标准实现的,通常称为 pthread。Linux 内核通过Native POSIX Thread Library提供了对多线程的支持。

1. 线程的基本概念

  • 线程是进程中的一个执行单元,是 CPU 调度的基本单位。
  • 线程共享进程的地址空间、文件描述符、信号处理等资源,但每个线程有自己的栈、程序计数器(PC)和寄存器状态。
  • 线程的创建、销毁和切换比进程更轻量级,适合需要并发执行的场景。

2. Linux 线程的实现

Linux 内核将线程视为一种特殊的进程,称为 轻量级进程。每个线程在内核中都有一个独立的 task_struct 结构体,但共享相同的进程资源(如内存空间、文件描述符等)。

  • NPTL(Native POSIX Thread Library)
    • 是 Linux 中实现 POSIX 线程标准的库。
    • 提供了高效的线程管理,支持大量线程的创建和调度。
    • 使用 1:1 线程模型,即每个用户级线程对应一个内核级线程。

3. 线程的创建与管理

在 Linux 中,线程的创建和管理主要通过 pthread 库提供的函数实现。常用的函数包括:

  • pthread_create

    • 用于创建一个新线程。

    • 原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

    • 例子:

      #include <pthread.h>
      void* thread_function(void* arg) {
          printf("Thread is running\n");
          return NULL;
      }
      int main() {
          pthread_t thread;
          pthread_create(&thread, NULL, thread_function, NULL);
          pthread_join(thread, NULL); // 等待线程结束
          return 0;
      }
      
  • pthread_join

    • 用于等待指定线程结束。
    • 原型:int pthread_join(pthread_t thread, void **retval);
  • pthread_exit

    • 用于线程主动退出。
    • 原型:void pthread_exit(void *retval);
  • pthread_cancel

    • 用于取消指定线程。
    • 原型:int pthread_cancel(pthread_t thread);

4. 线程同步机制

多线程编程中,为了避免竞争条件和数据不一致,需要使用同步机制。Linux 提供了以下同步工具:

  • 互斥锁(Mutex)
    • 用于保护共享资源,确保同一时间只有一个线程可以访问。
    • 相关函数:pthread_mutex_init, pthread_mutex_lock, pthread_mutex_unlock, pthread_mutex_destroy
  • 条件变量(Condition Variable)
    • 用于线程间的通信,允许线程等待特定条件满足。
    • 相关函数:pthread_cond_init, pthread_cond_wait, pthread_cond_signal, pthread_cond_broadcast
  • 信号量(Semaphore)
    • 用于控制对共享资源的访问数量。
    • 相关函数:sem_init, sem_wait, sem_post, sem_destroy
  • 读写锁(Read-Write Lock)
    • 允许多个读线程同时访问共享资源,但写线程独占访问。
    • 相关函数:pthread_rwlock_init, pthread_rwlock_rdlock, pthread_rwlock_wrlock, pthread_rwlock_unlock

5. 线程的属性

线程的属性可以通过 pthread_attr_t 结构体设置,常见的属性包括:

  • 线程的栈大小。
  • 线程的调度策略(如 SCHED_FIFO、SCHED_RR)。
  • 线程的分离状态(detached 或 joinable)。

相关函数:

  • pthread_attr_init
  • pthread_attr_setstacksize
  • pthread_attr_setschedpolicy
  • pthread_attr_setdetachstate

6. 线程的调度

Linux 中的线程调度遵循进程调度的规则,使用 CFS算法。可以通过以下函数设置线程的优先级和调度策略:

  • pthread_setschedparam
  • pthread_getschedparam

7. 线程的优缺点

优点

  • 线程的创建和切换比进程更快。
  • 线程间共享内存,通信更加高效。
  • 适合需要高并发的场景。

缺点

  • 线程间共享资源,容易引发竞争条件和死锁。
  • 调试多线程程序比单线程程序更复杂。

8. 线程与进程的比较

特性进程线程
资源占用较高(独立地址空间)较低(共享地址空间)
创建和切换较慢较快
通信方式管道、消息队列、共享内存等共享内存
独立性完全独立依赖于进程
适用场景需要隔离的任务需要高并发的任务

相关文章:

  • 使用joblib 多线程/多进程
  • 锂电池升压到5V并且可以锂电池充电的芯片SM5401
  • K8S学习之基础十六:k8s中Deployment更新策略
  • AUTOSAR—TM模块介绍及使用概要
  • 深入剖析 Kubernetes 弹性伸缩:HPA 与 Metrics Server
  • 文件解析:doc、docx、pdf
  • 开发环境搭建-06.后端环境搭建-前后端联调-Nginx反向代理和负载均衡概念
  • RAG了解与实践
  • QEMU源码全解析 —— 块设备虚拟化(1)
  • MySQL root用户密码忘记怎么办(Reset root account password)
  • Java面经
  • 字节跳动AI原生编程工具Trae和百度“三大开发神器”AgentBuilder、AppBuilder、ModelBuilder的区别是?
  • 蓝桥试题:传球游戏(二维dp)
  • 基于海思soc的智能产品开发(芯片sdk和linux开发关系)
  • unity console日志双击响应事件扩展
  • C#核心(21)万物之父Object中的方法
  • Lambda表达式使用介绍
  • 【Bootstrap5】Bootstrap5学习笔记
  • 数据库复习(第五版)- 第七章 数据库设计
  • 3.6c语言
  • 中国首次当选联合国教科文组织1970年《公约》缔约国大会主席国
  • 高温最强时段来了!北方局地高温有明显极端性
  • 莫高义在第四届中国新闻发言人论坛开幕式上的致辞
  • 中国新闻发言人论坛在京举行,郭嘉昆:让中国声音抢占第一落点
  • 最高检公布一起离婚纠纷典型案例:推动离婚经济补偿制度落实
  • 最高人民法院、中国证监会联合发布《关于严格公正执法司法 服务保障资本市场高质量发展的指导意见》