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

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

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


一、同步与互斥基础
  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. 优先使用高层同步机制:条件变量适合复杂同步逻辑,信号量适合资源池控制。

相关文章:

  • 精益数据分析(30/126):电商商业模式的深度剖析与关键指标解读
  • linux安装ragflow
  • 《从线性到二维:CSS Grid与Flex的布局范式革命与差异解析》
  • Tailwind CSS 响应式设计解析(含示例)
  • 【算法练习】归并排序和归并分治
  • JAVA使用Apache POI导出Word,支持向表格动态添加多行数据
  • taro小程序如何实现大文件(视频、图片)后台下载功能?
  • 为什么要学习《金刚经》
  • [AI]browser-use + web-ui 大模型实现自动操作浏览器
  • Android项目中使用ComposeUI
  • Html 2
  • OpenGL学习笔记(延迟着色法、SSAO)
  • 「Mac畅玩AIGC与多模态07」开发篇03 - 开发第一个 Agent 插件调用应用
  • c++进阶——BinarySearchTree(无相同值)的简单实现
  • 《软件测试52讲》学习笔记:如何设计一个“好的“测试用例?
  • 【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件(需要依赖qemu-aarch64、不需要重新安装iso)
  • 【Linux】Linux内核模块开发
  • MySQL 实战 45 讲 笔记 ----来源《极客时间》
  • 【Linux学习笔记】进程替换和自定义shell
  • 开源Kotlin从零单排0基础完美入门教程
  • 零食连锁鸣鸣很忙递表港交所:去年营收393亿元,门店超1.4万家,净利润率2.1%
  • 海尔智家一季度营收791亿元:净利润增长15%,海外市场收入增超12%
  • 五一小长假,带着小狗去上海音乐厅
  • 80后共青团云南省委副书记许思思已任迪庆州委副书记
  • 十四届全国人大常委会第十五次会议在京举行,审议民营经济促进法草案等
  • 没有雷军的车展:老外扎堆,萌车、机器狗谁更抢镜?| 湃客Talk