首页 > 其他分享 >信号量机制读者/写者问题写者优先的理解

信号量机制读者/写者问题写者优先的理解

时间:2022-11-24 19:38:10浏览次数:42  
标签:readcount 优先 wmutex 写者 信号量 读者 writecount rmutex

int readcount=0,writecount=0;
semaphore x=1,y=1,z=1;//x用来对readcount进行互斥访问,y用来对writecount进行互斥访问,z用来对使用读锁进行互斥访问
semaphore rmutex=1;wmutex=1;//读锁,写锁

由于写者优先,我们从读者优先的代码中得到灵感,这里可以给写者也添加一个记录写者数量的int型变量,当这个变量为0的时候,才允许写者访问临界区

写者的优先,也使得这里不能采用常用的单信号量访问机制,而是通过由读者和写者共同决定的rmutex来对读者进行限制,做到保证写者高优先级的同时读者自己又能够进入临界区同时可以多个读者一起读(这也是和其他的读写问题根本不同的地方)

最外层的z信号量由读者自己控制,而rmutex则由写者和读者共同控制,这样就保证了写者的优先级得到了保障

process reader{
p(z);//用来保证判断一次只有一个读者,即保证次序
p(rmutex);//这个信号量过后就能确保当前临界区中是没有写者的(这个是关键点)
p(x);
readcount++;
if(readcount==1)
p(wmutex);//如果现在有一个读者,那么往后优先级更高的写者不能进来
v(x);//释放对radcount的访问权限
v(rmutex);//释放对p(x)的访问权限
v(z);
read;
p(x);
readcount--;
if(readcount==0)
v(wmutex);
v(x);
}
process writer{
p(y);
writecount++;
if(writecount==1)
p(mutex);
v(y);
p(wmutex);
write;
v(wmutex);
p(y);
writecount--;
if(writecount==0)
v(rmutex);
v(y);
}

标签:readcount,优先,wmutex,写者,信号量,读者,writecount,rmutex
From: https://www.cnblogs.com/zirconium/p/16922966.html

相关文章

  • 数据结构的比较层级 类似html的优先级比较
    近开发安全键盘的时候发现有一个矛盾的问题,如果都设置了边框,也设置了阴影的情况下,到底是要前者还是后者,这就需要比较了///<summary>///有这么一种情况shadowIn......
  • 为什么要设置需求优先级?如何设置?
    本文将围绕以下问题展开:1、什么是需求优先级排序,目的是什么?2、优先级排序的8大依据;3、需求优先级排序面临的挑战;4、一些优秀的需求优先级排序工具。 一、什么是需求优......
  • 嵌入式操作系统内核原理和开发(通用优先级调度)
       相比较其他调度算法而言,时间片的轮转更多的注重公平性。但是,任务与任务之间也是有先后之分的,有的任务我们希望多安排一些时间片,而有的任务我们则希望少安排一些时间......
  • 嵌入式操作系统内核原理和开发(改进型优先级调度)
       上面的一篇博客说到了优先级调度,但是那个优先级调度算法比较极端。打个比方说,现在王先生有三个小孩,分别是老大、老二、老三。假设现在到了饭点,王先生需要给三个小孩......
  • 嵌入式操作系统内核原理和开发(信号量)
        之前因为工作的原因,操作系统这块一直没有继续写下去。一方面是自己没有这方面的经历,另外一方面就是操作系统比较复杂和琐碎,调试起来比较麻烦。目前在实际项目中,使......
  • 深度优先遍历查找
    一.题目二.思路深度优先遍历+回溯法三.代码#include<stdio.h>#include<malloc.h>intn,m;int*path;intcount[2];//0代表-,1代表ointkey;//第k个intcount_=......
  • 优先级
    rtos中,对任务的调度是按最高优先级的顺序进行的,所以需要对每个任务进行优先级的定义,而有了优先级之后,其他的代码:如结构体,创建任务,切换任务,阻塞延时等都需要相应修改 1.......
  • 深度优先生成树和广度优先生成树的详解版
    其实在对无向图进行遍历的时候,遍历过程中所经历过的图中的顶点和边的组合,就是图的生成树或者生成森林。图1无向图 例如,图1中的无向图是由V1~V7的顶点和编号分......
  • 多进程实现TCP服务端并发、互斥锁代码实操、线程理论、创建线程的两种方式、线程的诸
    多进程实现TCP服务端并发importsocketfrommultiprocessingimportProcessdefget_server():server=socket.socket()server.bind(('127.0.0.1',8080))......
  • 互斥锁、死锁、信号量、线程、协程
    互斥锁、死锁、信号量、线程、协程目录互斥锁、死锁、信号量、线程、协程互斥锁互斥锁代码实操线程理论创建线程的两种方式线程的诸多特性GIL全局解释器锁验证GIL的存在GI......