自学嵌入式day33,互斥和同步

线程控制:互斥与同步

互斥(Mutex)

概念

在多线程环境中,互斥用于保证对临界资源 (如全局变量、文件、设备)的排他性访问 。当多个线程并发执行时(如 th1th2 交替运行),对共享资源的非原子操作(如 a++ 对应的多步汇编指令)可能导致数据不一致。互斥锁通过将临界区代码封装为原子操作(一次线程调度中必须完整执行),确保同一时刻仅有一个线程访问资源。

使用步骤

  1. 定义互斥锁

    c 复制代码
    pthread_mutex_t mutex;
  2. 初始化锁

    c 复制代码
    int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
    • attr 通常设为 NULL(默认属性)。
    • 返回值:成功返回 0,失败返回非零值。
  3. 加锁

    c 复制代码
    int pthread_mutex_lock(pthread_mutex_t *mutex);
    • 若锁已被占用,则阻塞当前线程。
    • 临界区代码需短小,避免耗时操作或休眠。
  4. 解锁

    c 复制代码
    int pthread_mutex_unlock(pthread_mutex_t *mutex);
  5. 销毁锁

    c 复制代码
    int pthread_mutex_destroy(pthread_mutex_t *mutex);

同步(Semaphore)

概念

同步是互斥的扩展,用于控制线程执行的先后顺序。与互斥锁不同:

  • 互斥锁:加锁和解锁由同一线程完成。
  • 信号量 :线程可交叉释放资源(如 th1 释放 th2 的资源)。
  • 计数信号量 :初值可大于 1(如资源池),支持多线程并发访问。

使用步骤

  1. 定义信号量

    c 复制代码
    sem_t sem;
  2. 初始化信号量

    c 复制代码
    int sem_init(sem_t *sem, int pshared, unsigned int value);
    • pshared=0:线程间共享;pshared≠0:进程间共享。
    • value:初始资源数(如二值信号量设为 1)。
  3. P/V 操作

    • P 操作(申请资源)

      c 复制代码
      int sem_wait(sem_t *sem); // 资源不足时阻塞
    • V 操作(释放资源)

      c 复制代码
      int sem_post(sem_t *sem); // 释放后信号量值 +1
  4. 销毁信号量

    c 复制代码
    int sem_destroy(sem_t *sem);

死锁

产生条件

死锁由以下四个必要条件同时满足导致:

  1. 互斥条件:资源仅能被一个线程占用。
  2. 请求与保持:线程阻塞时仍持有已获取的资源。
  3. 不可剥夺:资源在使用完前不能被强制释放。
  4. 循环等待:线程间形成环形资源依赖链。

预防策略

  • 破坏任一条件即可避免死锁,例如:
    • 按固定顺序申请锁。
    • 设置锁超时机制。

互斥 vs. 信号量
特性 互斥锁 信号量
资源数量 单一资源 可多资源(计数信号量)
加解锁主体 同一线程 可跨线程交叉释放
适用场景 短临界区 允许休眠或耗时操作

相关推荐
用户0292666613320 分钟前
Linux 用户管理知识与应用实践(三:用户组及修改用户密码)
linux
Mortalbreeze42 分钟前
深入 Linux 线程机制(三):线程互斥——竞争条件与互斥锁的本质
linux·运维·服务器·c++·算法
鱼听禅1 小时前
CentOS 源码模式配置SVNAdmin2管理SVN仓库
linux·svn·centos
Amonter1 小时前
RK3399ProD移植主线Linux内核
linux·rockchip·rk3399pro
say_fall2 小时前
【Git 精品详解】企业规范:企业级开发模型、Git Flow、发版流程规范、Code Owner 制度、事故应急回滚
大数据·linux·服务器·git·学习·elasticsearch
一杯奶茶¥2 小时前
Ubuntu系统镜像各个版本下载Ubuntu镜像合集资源Linux系统镜像乌班图Linux系统镜像
linux·运维·ubuntu·镜像·;inux镜像·ubuntu镜像
三84412 小时前
文件查找/文件压缩/解压缩
linux·运维·服务器
小猪写代码12 小时前
Linux 管道(Pipeline)作业
linux·运维·服务器
会周易的程序员14 小时前
microLog 的本地日志读取接口 log_reader — 本地日志文件读取工具开发指南
linux·物联网·架构·嵌入式·日志·iot·aiot
yoothey14 小时前
报废审批流规则引擎设计——责任链模式完整实现
linux·开发语言·bash