热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

信号量同步互斥问题

一、信号量信号量是一种抽象数据类型由一个整型(sem)变量和两个原子操作组成P():sem减1,如果sem

一、信号量

信号量是一种抽象数据类型


  1. 由一个整型(sem)变量和两个原子操作组成
  2. P()&#xff1a;sem减1&#xff0c;如果sem<0进入等待状态&#xff0c;否则继续
  3. V()&#xff1a;sem加1&#xff0c;如果sem<&#61;0则唤醒一个等待的线程
    这里写图片描述

二、管程

管程是一种用于多线程互斥访问共享资源的程序结构


  1. 局部数据变量只能被管程的过程访问&#xff0c;任何外部过程都不能访问
  2. 一个进程通过调用管程的一个过程进入管程
  3. 在任何时候&#xff0c;只能有一个进程在管程中执行&#xff0c;调用管程的任何其他进程都被阻塞&#xff0c;以等待管程可用

管程的使用


  1. 管理共享数据
  2. 定义访问共享数据的方法

这里写图片描述
条件变量


  1. 条件变量是管程内的等待机制
    1.1. 进入管程的线程因资源被占用而进入等待状态
    1.2. 每个条件变量表示一种等待原因&#xff0c;对应一个等待队列
  2. Wait()操作
    2.1. 将自己阻塞在等待队列中
    2.2. 放弃对管程的互斥访问权限&#xff08;同一时刻管程只能有一个进程访问&#xff09;
  3. Signal()操作
    3.1. 将等待队列中的一个线程唤醒&#xff08;信号量机制中的Signal是释放一个信号量&#xff0c;如果信号量≤0则唤醒一个线程&#xff09;

三、生产者消费者问题

这里写图片描述
①生产者在生成数据后放在一个缓冲区里
②消费者从缓冲区中读取数据
③任何时刻只能有一个生产者或消费者可以访问缓冲区

问题分析&#xff1a;
①任何时刻只能有一个线程操作缓冲区
②缓冲区满时&#xff0c;生产者要等待消费者
③缓冲区空时&#xff0c;消费者要等待生产者

利用信号量解决
这里写图片描述

利用管程解决
这里写图片描述


四、哲学家就餐问题

问题描述
这里写图片描述

解决方案
这里写图片描述
这里写图片描述
这里写图片描述


五、读者-写者问题

这里写图片描述

管程的状态变量
这里写图片描述


  • AR&#xff1a;正在读的读者数量
  • AW&#xff1a;正在写的写者数量
  • WR&#xff1a;等待读的读者数量
  • WW&#xff1a;等待写的写者数量
  • okToRead&#xff1a;读者的等待队列
  • okToWrite&#xff1a;写者的等待队列

读者模块&#xff08;写者优先&#xff09;
这里写图片描述
startRead()&#xff1a;如果有写者正在写或等待写&#xff0c;则进入等待队列
DoneRead()&#xff1a;如果没有读者在读且有写者等待写&#xff0c;则唤醒写者

写者模块&#xff08;写者优先&#xff09;
这里写图片描述
StartWrite()&#xff1a;如果有读者在读或有写者在写&#xff0c;则进入等待队列
DoneWrite()&#xff1a;如果有写者等待写&#xff0c;则优先唤醒写者&#xff0c;或者唤醒等待的读者


推荐阅读
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 本文详细介绍了Grand Central Dispatch (GCD) 的核心概念和使用方法,探讨了任务队列、同步与异步执行以及常见的死锁问题。通过具体示例和代码片段,帮助开发者更好地理解和应用GCD进行多线程开发。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
    本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 深入解析RDMA中的队列对(Queue Pair)
    本文将详细探讨RDMA架构中的关键组件——队列对(Queue Pair,简称QP),包括其基本概念、硬件与软件实现、QPC的作用、QPN的分配机制以及用户接口和状态机。通过这些内容,读者可以更全面地理解QP在RDMA通信中的重要性和工作原理。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文详细介绍了数组和线性表这两种常见的数据结构。数组是一种由类型名、标识符及维度构成的复合数据类型,其元素类型由类型名决定,维数表示数组中元素的数量。线性表则是一种逻辑结构,其中的数据元素呈现一对一的关系,便于实现和操作。 ... [详细]
  • LeetCode: 实现队列与栈的高级应用
    本文介绍如何使用队列和栈实现特定功能,包括动态维护队列元素并计算其平均值,以及栈操作中的优化技巧。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
author-avatar
墨鱼轩869
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有