线程相关编程、线程间通信、互斥锁

  • 一、线程的创建
    • #include <pthread.h>

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

      • 功能:创建一个新的线程
      • 参数:thread:保存线程ID的变量地址;attr:线程属性的对象地址;NULL:按照默认属性创建;start_routine:函数的指针:指向线程启动后要执行的任务(线程任务函数);arg:为线程任务函数传递的参数
      • 返回值:成功:0;失败:非0
    • eg.需要注意的是,线程相关函数在编译时需要链接pthread库(-pthread)

  • 线程的调度 :线程调度由操作系统内核管理
  • 线程的终止
    • pthread_exit :void pthread_exit(void *retval);
      • 功能:退出一个线程任务
      • 参数:retval:向回收的线程传递的参数的地址;NULL:表示不传递参数
    • pthread_join :int pthread_join(pthread_t thread, void **retval)
      • 功能:阻塞等待线程结束,回收线程资源空间
      • 参数:thread:要回收的线程ID;retval:用来保存线程退出时传递的参数;NULL:不接受参数
      • 返回值:成功:0;失败:-1
    • int pthread_detach(pthread_t thread);
      • 功能:将线程设置成分离属性的线程,线程结束后自动释放资源
  • 二、线程的回收策略
    • 分离属性的线程:不需要回收,由操作系统回收(没有空闲的线程可帮忙回收时)
    • 非分离属性的线程:pthread_join()阻塞回收
  • 线程的属性
    • 分离属性:不需要被其他线程回收的线程称为分离属性得到线程,将来会被操作系统所回收
    • 非分离属性:可以被其他线程回收或者结束的线程,称为非分离属性的线程(默认属性:非分离属性)
  • 函数指针:
    • 定义:
      • 返回值类型(*指针名称)(形参表);
      • void *(*pfun)(void *)
    • 函数指针指针初始化:
      • 返回值类型(*指针名称)(形参表)=函数的地址;
      • void * (*pfun)(void *)= main_ctl(函数名);
    • 函数指针赋值:
      • 函数指针名称=函数的入口地址;
      • void *(*pfun)(void *)=NULL;
      • pfun=main_ctl;
    • 函数指针怎么使用:
      • 函数名(实参表);
      • 函数指针(实参表);
  • 函数指针数组:保存多个函数指针
    • 返回值类型型(*数组名称n)(形参表);
    • void*(*pfun5)(void *)
  • 三、线程间通信
    • 全局变量通信
      • 临界资源:多个线程可以同时访问的资源称为临界资源;比如,全局变量、共享内存区域等多个线程在访问临界资源时,存在资源竞争问题
      • 如何解决资源竞争问题:
        • 互斥机制:多个线程访问临界资源时,具有排他性访问的机制(一次只允许一个线程对该临界资源进行访问)
    • 全局队列
    • 共享内存区域
  • 四、互斥锁:是线程同步的基本工具,用于保护共享资源,防止多个线程同时访问导致的数据竞争问题
    • 创建互斥锁
      • pthread_mutex_t
    • 初始化互斥锁
      • int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
        • 功能:初始化互斥锁
        • 参数:mutex:锁对象地址;attr:锁的属性(NULL:默认属性)
        • 返回值:成功:0;失败:-1
    • 加锁
      • int pthread_mutex_lock(pthread_mutex_t*mutex);
    • 解锁
      • int pthread_mutex_unlock(pthread_mutex_t *mutex)
    • 销毁锁
      • int pthread_mutex_destroy(pthread_mutex_t *mutex);
      • 确保没有线程持有或等待该锁
      • 静态初始化的互斥锁不需要销毁
    • 互斥锁使用模式
相关推荐
GeW7 小时前
新质生产力路线图Linux、数据库、国产化替代一次讲透
linux
zyl7658 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
aningx9 小时前
cachyos 从 GRUB 切换到 rEFInd
linux
第404号工位10 小时前
40块钱二手瘦客户端,如何跑满家庭物联网中枢?(拒绝Docker爆盘实录)
linux·架构·node.js
骑着蜗牛撵大象32712 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
爱读书的小胖12 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌12 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
..Dauntless..12 小时前
【Linux】一切皆文件和缓冲区
linux·运维·服务器
QMCY_jason12 小时前
x86 ubuntu2204 无gui 安装 openeuler 2203 aarch64版本
linux·运维·服务器
重生之小比特12 小时前
【Linux系统】12 进程程序替换 自定义Shell 命令行解释器
linux·运维·服务器