热门标签 | 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;或者唤醒等待的读者


推荐阅读
  • 本文详细介绍了Sleep函数的基本概念、使用方法及其背后的实现原理。适合对Sleep函数的使用和实现感兴趣的开发者阅读。通过本文,您将了解如何在不同操作系统中使用Sleep函数,以及其在多线程编程中的重要性。 ... [详细]
  • 关于进程的复习:#管道#数据的共享Managerdictlist#进程池#cpu个数1#retmap(func,iterable)#异步自带close和join#所有 ... [详细]
  • 大华股份2013届校园招聘软件算法类试题D卷
    一、填空题(共17题,每题3分,总共51分)1.设有inta5,*b,**c,执行语句c&b,b&a后,**c的值为________答:5 ... [详细]
  • 我自己做了一个网站图片的抓取,感觉速度有点慢抓取4000张图片可能得用15分钟左右的时间,我百度看用线程可以加快抓取,然后创建了5个线程抓取,但是5个线程是同步执行同样的操作一个图片就 ... [详细]
  • 在iOS开发中,多线程技术的应用非常广泛,能够高效地执行多个调度任务。本文将重点介绍GCD(Grand Central Dispatch)在多线程开发中的应用,包括其函数和队列的实现细节。 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 本文将深入探讨 iOS 中的 Grand Central Dispatch (GCD),并介绍如何利用 GCD 进行高效多线程编程。如果你对线程的基本概念还不熟悉,建议先阅读相关基础资料。 ... [详细]
  • 本文详细介绍了如何对一个整数的二进制表示进行逆序操作。通过多种方法,包括直接法、查表法和分治法,帮助读者全面理解和掌握这一技术。 ... [详细]
  • Spring Boot + RabbitMQ 消息确认机制详解
    本文详细介绍如何在 Spring Boot 项目中使用 RabbitMQ 的消息确认机制,包括消息发送确认和消息接收确认,帮助开发者解决在实际操作中可能遇到的问题。 ... [详细]
  • Redis 是一个高性能的开源键值存储系统,支持多种数据结构。本文将详细介绍 Redis 中的六种底层数据结构及其在对象系统中的应用,包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象。通过12张图解,帮助读者全面理解 Redis 的数据结构和对象系统。 ... [详细]
  • RocketMQ 运维监控实践指南
    本文详细介绍了如何实现 RocketMQ 的运维监控,包括监控平台的搭建、常用运维命令及其具体用法。适合对 RocketMQ 监控感兴趣的读者参考。 ... [详细]
  • 优先队列是一种特殊的队列,不遵循先进先出原则。它分为最大优先队列和最小优先队列。最大优先队列总是将当前最大的元素优先出队,而最小优先队列则总是将当前最小的元素优先出队。本文将详细介绍如何使用二叉堆在C#中实现这两种优先队列。 ... [详细]
  • Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ... [详细]
  • Python多线程详解与示例
    本文介绍了Python中的多线程编程,包括僵尸进程和孤儿进程的概念,并提供了具体的代码示例。同时,详细解释了0号进程和1号进程在系统中的作用。 ... [详细]
  • 本文总结了Java初学者需要掌握的六大核心知识点,帮助你更好地理解和应用Java编程。无论你是刚刚入门还是希望巩固基础,这些知识点都是必不可少的。 ... [详细]
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社区 版权所有