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

线程同步与互斥核心要点整理

线程同步与互斥核心要点整理


一、同步与互斥基础
  1. 核心问题

    • 数据竞争:多线程共享资源(全局变量、文件、数据库)时,CPU时间片轮询可能导致数据错乱。
    • 示例:银行账户操作中,存钱与取钱线程并发执行可能破坏余额一致性。
  2. 关键概念

    • 互斥:同一时间仅一个线程访问临界资源,通过互斥锁实现。
    • 同步:控制线程执行顺序,通过信号量、条件变量实现。
    • 临界资源:多线程共享的资源(如int money)。
    • 临界区:操作临界资源的代码段(如修改money的代码)。

二、互斥锁(pthread_mutex_t
  1. 核心函数

    函数功能参数说明
    pthread_mutex_init()初始化锁(静态/动态)锁指针、属性(NULL为普通锁)
    pthread_mutex_lock()阻塞式加锁锁指针
    pthread_mutex_trylock()非阻塞尝试加锁锁指针
    pthread_mutex_unlock()解锁锁指针
    pthread_mutex_destroy()销毁锁锁指针
  2. 特性

    • 普通锁:重复加锁会导致死锁。
    • 递归锁:允许同一线程多次加锁,通过属性PTHREAD_MUTEX_RECURSIVE_NP设置。
    • 代码示例

      c

       
      pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
      pthread_mutex_lock(&mutex);
      // 临界区操作
      pthread_mutex_unlock(&mutex);

三、死锁与递归锁
  1. 常见死锁场景

    • 重复加锁:同一线程对同一锁多次加锁。
    • 交叉加锁:线程A持有锁1请求锁2,线程B持有锁2请求锁1。
    • 未释放锁:线程异常退出未解锁。
  2. 递归锁解决方案

    • 初始化递归锁
      pthread_mutexattr_t attr;
      pthread_mutexattr_init(&attr);
      pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
      pthread_mutex_init(&mutex, &attr);
    • 递归锁示例:允许函数递归调用时多次加锁。

四、信号量(sem_t
  1. 核心函数

    函数功能参数说明
    sem_init()初始化信号量信号量指针、共享标志(0为线程共享)、初始值
    sem_wait()P操作(信号量减1,阻塞)信号量指针
    sem_post()V操作(信号量加1)信号量指针
    sem_destroy()销毁信号量信号量指针
  2. 应用场景

    • 控制并发线程数:如允许多个线程同时写入日志文件。
    • 生产者-消费者模型:通过信号量协调生产与消费的节奏。
    • 代码示例
      sem_t sem;
      sem_init(&sem, 0, 3); // 允许3个线程并发访问
      sem_wait(&sem); // 进入临界区
      sem_post(&sem); // 退出临界区

五、条件变量(pthread_cond_t
  1. 核心函数

    函数功能参数说明
    pthread_cond_init()初始化条件变量条件变量指针、属性(通常为NULL)
    pthread_cond_wait()阻塞线程,释放锁并等待信号条件变量指针、互斥锁指针
    pthread_cond_signal()唤醒一个等待线程条件变量指针
    pthread_cond_broadcast()唤醒所有等待线程条件变量指针
    pthread_cond_destroy()销毁条件变量条件变量指针
  2. 应用场景

    • 生产者-消费者模型:生产者生产数据后唤醒消费者。
    • 解决空转问题:通过标志位(如flag)判断是否需要等待。
    • 代码示例
      pthread_cond_t cond;
      pthread_mutex_t mutex;
      int flag = 0;
      // 生产者
      pthread_mutex_lock(&mutex);
      flag = 1;
      pthread_cond_signal(&cond);
      pthread_mutex_unlock(&mutex);
      // 消费者
      pthread_mutex_lock(&mutex);
      while (flag == 0) {
      pthread_cond_wait(&cond, &mutex);
      }
      // 消费数据
      pthread_mutex_unlock(&mutex);

六、线程顺序控制
  1. 互斥锁实现顺序控制
    • 示例:通过多把锁强制线程执行顺序(如打印ABC)。
      // 线程A
      pthread_mutex_lock(&a);
      printf("A");
      pthread_mutex_unlock(&b);
      // 线程B
      pthread_mutex_lock(&b);
      printf("B");
      pthread_mutex_unlock(&c);
      // 线程C
      pthread_mutex_lock(&c);
      printf("C");
      pthread_mutex_unlock(&a);

七、生产者-消费者模型优化
  1. 最终版代码逻辑
    • 双条件变量:生产者和消费者使用不同的条件变量(condcond1)。
    • 共用互斥锁:通过flag标志位和循环检查避免空转。
    • 核心代码
      // 生产者
      pthread_mutex_lock(&mutex);
      while (flag != 0) pthread_cond_wait(&cond1, &mutex);
      flag = 1;
      pthread_cond_signal(&cond);
      pthread_mutex_unlock(&mutex);
      // 消费者
      pthread_mutex_lock(&mutex);
      while (flag != 1) pthread_cond_wait(&cond, &mutex);
      flag = 0;
      pthread_cond_signal(&cond1);
      pthread_mutex_unlock(&mutex);

八、机制对比与最佳实践
机制用途特点
互斥锁保证临界资源独占访问简单高效,但无法控制顺序
信号量控制并发线程数量可设置资源池大小(如连接池)
条件变量线程间状态通知与协作需配合互斥锁,解决复杂同步问题

最佳实践

  1. 避免死锁:按固定顺序请求锁,使用超时机制(如pthread_mutex_trylock)。
  2. 减少锁粒度:仅对必要代码段加锁,缩短临界区。
  3. 优先使用高层同步机制:条件变量适合复杂同步逻辑,信号量适合资源池控制。
http://www.xdnf.cn/news/3221.html

相关文章:

  • 即时设计笔记
  • C++搞定周岁.虚岁计算
  • 【网络】HTTP报文首部字段
  • 使用 ECharts 在 Vue3 中柱状图的完整配置解析
  • 大数据测试集群环境部署
  • linux 内核 debugfs 使用介绍
  • Python 打包兼容Win7 的Qt 程序
  • 【题解-Acwing】869. 试除法求约数
  • 解决react-native下背景图渲染,统一处理组件BackgroundImage
  • 【Python笔记 05】 if判断、比较运算符与逻辑运算符
  • 《AI大模型应知应会100篇》【精华】第40篇:长文本处理技巧:克服大模型的上下文长度限制
  • 如何防止丝杆支撑座锈蚀?
  • MIT6.S081-lab7
  • 第12讲:组合多图(Patchwork)艺术
  • C++复习补充 IO
  • Nginx核心功能与LNMP部署
  • C语言Makefile编写与使用指南
  • 小米喷墨打印机Mi All-in-One Inkjet Printer电脑通过管理打印设备扫描文件方法完整记录
  • 「国产嵌入式仿真平台:高精度虚实融合如何终结Proteus时代?」——从教学实验到低空经济,揭秘新一代AI赋能的产业级教学工具
  • 使用O_DIRECT + 批量写数据到磁盘对丢包率的优化
  • Hanko:身份验证和用户管理解决方案,Clerk Auth0 的开源替代
  • [密码学实战]SDF之对称运算类函数(四)
  • 【缓冲区分析】叠加分析-要素叠加
  • Plesk 下的 IP 地址管理
  • MicroBlaze软核的开发使用
  • 分步详解:凤凰6000模拟器接入Unity Input System‌(
  • docker排查OOM Killer
  • SVN子路径权限设置及登录方法详解
  • docker学习笔记6-安装wordpress
  • AB3 有效括号序列