读者作家(RW)或共享独占锁(也称为多个读取器/单写入器锁定或多读卡器锁)的一个同步原语,解决了一个读者-writers问题。一个RW锁允许并发的只读操作的访问,而写操作需要独占访问。这意味着多个线程可以并行读出的数据,但独占锁是需要编写或修改数据。当一个作家写数据,直到作家写完所有其他作家或读者将被阻止。一个常见的用途可能是用于控制访问存储器中的数据结构不能被更新原子和是无效的(不应该由另一个线程被读取),直到完成更新。
读者作家锁通常建在上面互斥和条件变量,或在顶部信号量。

优先级策略
RW锁可设计为读者与作家访问不同的优先政策。锁可以被设计成总是给读者(优先读喜欢),总是优先考虑的作家(写喜欢),或者是不确定的问候优先。这些政策导致的问候不同的权衡并发和饥饿。
读优先RW锁允许最大的并发,但可能会导致如果争高写饥饿。这是因为写线程将不能只要至少有一个读线程持有它来获取锁。由于多个读线程可以举行一次锁定,这意味着一个作家线程可能会继续等待锁,而新读者线程能够获取锁,甚至到了作家可毕竟还是读者的等待点其分别持有的锁时,它首先试图获取它已经发布了锁。优先读者可能疲软,因为刚才所描述的,或强,这意味着只要一个作家释放锁,任何阻塞的读者总是得到它旁边。
写优先RW锁,防止任何避免写入器资源匮乏的问题,新的读者从获取锁,如果有一个作家排队,等待锁; 作为已经持有该锁的所有读者已经完成了作家会尽快获取该锁。缺点是,宁愿写锁允许在写线程的情况下少并发,相比读宁愿RW锁。另外,锁是少高性能,因为每个操作,取或释放锁读或写,比较复杂,需要内部采集和发行了两张互斥体而不是一个。这种变化有时也被称为“直写偏见“的读者,作家锁。

未指定优先RW锁不提供任何担保与读与写访问的问候。未指定优先级可以在某些情况下是可取的,如果它允许更有效的实现。

接下来,我们便自己实现一个简单的读者-writers问题

首先,我们来看一个新的函数:

代码如下:

那么结果呢?

替代品
读-复制-更新(RCU)算法是一种解决方案给读者编写者问题。RCU是无等待读者。在Linux内核中实现了所谓的少数作家一个特殊的解决方案顺序锁。

读者写者问题浅析(代码实现)相关推荐

  1. OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)(转)

    一. 引子 最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程.线程.互斥等,就拿以前学过的 OS 问题开开刀啦.记得当年学读者写者问题,尤其是写者优先的 ...

  2. 信号量机制实现读者写者问题(思路剖析+Java代码实现+验证)

    写在前面: Java中: 我们用这样的代码新建一个信号量:Semaphore mutex = new Semaphore(1); P操作(wait)的代码为:mutex.acquire(); V操作( ...

  3. 操作系统读者写者问题代码实现

    问题分析: 读者优先: 读者进程执行: 无其他读者写者, 直接执行 有写者等, 但其他读者在读, 直接读 有写者写, 等待 写者进程执行: 无其他读写者, 直接执行 有其他读写者, 等待 写者优先: ...

  4. 如何写出漂亮的代码:七个法则

    如何写出漂亮的代码:七个法则. 首先我想说明我本文阐述的是纯粹从美学的角度来写出代码,而非技术.逻辑等.以下为写出漂亮代码的七种方法: 1, 尽快结束 if语句 例如下面这个JavaScript语句, ...

  5. python用什么软件编程1001python用什么软件编程-怎样才能写出 Pythonic 的代码 #P1001#...

    L = [ i*i fori inrange(5) ] forindex, data inenumerate(L, 1):print(index, ':', data) 去除 import 语句和列表 ...

  6. python好学吗1001python好学吗-怎样才能写出 Pythonic 的代码 #P1001#

    L = [ i*i fori inrange(5) ] forindex, data inenumerate(L, 1):print(index, ':', data) 去除 import 语句和列表 ...

  7. 操作系统(二十六)读者写者问题

    2.3.9 读者写者问题 读者写者问题是十分经典的进程同步的问题,问题描述如下:读进程与写进程共享文件,但是写进程必须与其他进程互斥发生. 根据以上的题目要求我们可以得出一些互斥关系:写进程与写进程互 ...

  8. 如何写出健壮的代码?

    简介:关于代码的健壮性,其重要性不言而喻.那么如何才能写出健壮的代码?阿里文娱技术专家长统将从防御式编程.如何正确使用异常和 DRY 原则等三个方面,并结合代码实例,分享自己的看法心得,希望对同学们有 ...

  9. 秒杀多线程第十四篇 读者写者问题继 读写锁SRWLock

    在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一 ...

最新文章

  1. 【大数据风控体系】理想大数据风控体系
  2. STM32的独立看门狗(IWDG)看门狗时间计算
  3. MoveAbsJ在使用时和MOVEJ有什么区别
  4. LeetCode 1085. 最小元素各数位之和
  5. MySQL入门之创建、修改、删除、查看数据库
  6. 安凯无人驾驶_完美运行零失误 安凯无人驾驶巴士挑战“世界第一玻璃桥”
  7. 解决Failed to load the JNI shared library xxx/xxx/jvm.dll 错误
  8. K8s稳居容器榜首,Docker冲顶技术热词,微服务应用热度不减,2021云原生开发者现状
  9. jsp数据库连接大全和数据库操作封装到Javabean
  10. 在AD09中怎样同时高亮两个网络(即net)?按住Ctrl,鼠标点一个网络,按住Ctrl+Shift,鼠标再点另一个网络,想亮多少亮多少。
  11. VSCode开发react-native app进行android apk打包
  12. linux下命令打开url,在linux命令下访问url
  13. 华胜天成-容灾流程管理平台解决方案
  14. 布客·ApacheCN 编程/大数据/数据科学/人工智能学习资源 2020.1
  15. 在vue中使用html表格
  16. 利用GeoLite2-City.mmdb开源库将IP转换成经纬度—java项目小Demo
  17. 美国对华贸易逆差及其为何如此之高
  18. 零基础超简单的Docker入门教程 So Easy
  19. 分享一个好东西(一天精通MongoDB数据库)
  20. 每日一篇机器学习公众号D3-字节跳动安全Ai挑战赛-小样本赛道方案总结

热门文章

  1. CRUISE纯电动车仿真模型,simulink DLL联合仿真,实现电制动优先能量回收策略
  2. 基于弱网感知的5G QoS保障服务实现方案
  3. 计算机属性打开自动关上,如何打开和关闭系统的自动更新
  4. HTC S510b官方解锁、刷recovery、刷ROOT教...
  5. OpenGL ES EGL eglSwapBuffer
  6. 正版软件 | DaisyDisk:Mac 电脑一流的磁盘空间管理工具
  7. 调查研究论文的描述性统计结果该如何分析讨论?
  8. 手机音乐转换成mp3格式
  9. 【工业互联网】康鹏举:工业互联网平台的技术内核与创新应用
  10. 贝加莱梯形图介绍与使用