草庐IT

聊聊Golang的读写锁

浩仔浩仔 2023-03-28 原文
Go语言中的RWMutex是一种读写锁,它采用了读写分离的思想,可以同时支持多个读操作,但只能同时有一个写操作。它的原理是这样的:

  1. RWMutex内部维护两个计数器,一个是读计数器,一个是写计数器。
  2. 在读操作执行时,读计数器会加1,如果此时写计数器的值不为0,则说明有写操作正在进行,那么这个读操作就需要阻塞等待。
  3. 在写操作执行时,会先判断读计数器的值是否为0,如果不为0,则说明有读操作正在进行,那么这个写操作就需要阻塞等待。写操作执行时,会把写计数器加1,这样其他读写操作就无法继续执行了。
  4. 当读操作执行完毕时,读计数器会减1,如果此时读计数器的值为0,那么说明没有其他读操作在进行了,可以允许写操作了。
  5. 当写操作执行完毕时,写计数器会减1,如果此时写计数器的值为0,那么说明没有其他读写操作在进行了,此时其他读写操作就可以继续执行了。
当有大量读时,写操作不会饿死,这是因为读写锁支持优先处理写操作的。具体来说,当一个写操作请求锁时,如果此时已经有其他读或写操作持有锁,那么该写操作会被阻塞,等待其他操作释放锁。但是,一旦没有任何读或写操作持有锁,那么该写操作会立即获取到锁,并且优先执行,即使此时已经有很多读操作在等待。

也就是说读写锁并不是公平锁。因为并不保证等待时间最长的线程能够最先获取锁。

如果需要使用公平锁,可以考虑使用sync.Mutex,它保证等待时间最长的线程能够最先获取锁。但是需要注意的是,公平锁会导致额外的开销,因为它需要维护等待队列,进行线程切换等操作。

有关聊聊Golang的读写锁的更多相关文章

  1. ruby - 在未安装 Excel 的服务器上使用 Ruby 读写 Excel 文件 - 2

    我需要在一台没有安装Excel的Linux服务器上读写(->转换)Excel文件。对于Python,存在http://www.python-excel.org/.Ruby有类似的东西吗?可能不需要处理最新的Office格式。只需旧的xls文件就足够了。 最佳答案 我同意Gonzih的观点,并且我经常使用roo。它允许我使用模板文件进行读取、写入和写入。该项目在他们的site上有很好的记录。.我总是使用类似的东西:input=Excel.new(path)output=Array.newinput.default_sheet=inpu

  2. ruby - 使用符号读写 Sinatra 参数,例如参数[:id] - 2

    我的表单通过POST接收数据。当我执行putsparams时,我可以看到:{"id"=>"123","id2"=>"456"}现在是命令:putsparams['id']#=>123putsparams[:id]#=>123params['id']='999'putsparams#=>{"id"=>"999","id2"=>"456"}但是当我这样做的时候:params[:id]='888'putsparams我明白了{"id"=>"999","id2"=>"456",:id=>"888"}在IRB中它工作正常:params#=>{"id2"=>"2","id"=>"1"}params

  3. AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序 - 2

    一、概述在之前的一篇博文中,记录了AT24C01、AT24C02芯片的读写驱动,先将之前的相关文章include一下:1.IIC驱动:4位数码管显示模块TM1637芯片C语言驱动程序2.AT24C01/AT24C02读写:AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序本文记录分享AT24C04、AT24C08、AT24C16芯片的单片机C语言读写驱动程序。二、芯片对比介绍型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数备注AT24C044k5123216A2A149/1WordAddress使用P0位AT24C088k1024

  4. 【思考】聊聊低代码的实践之路 - 2

    文章目录背景一、最初的疑惑二、简单聊聊原理三、组织内实践案例四、实践带来的反思五、最后聊几句问题背景这个概念由来已久,但是在国内兴起,是最近几年;低代码即Low-Code;指提供可视化开发环境,可以用来创建和管理软件应用;简单的说就是可以通过各种组件的拖拽,实现页面的创建,交互流程和逻辑,以及数据层面的管理,更加高效的实现需求;早先在数据公司时;见识过低代码的应用,也参与过部分研发,比如元数据平台,BI分析等;不过,当时还是以数据管理的工具来定义项目,并非是低代码;从「2020年底」开始;实际上,那个时间节点,低代码平台的应用已经形成趋势了;现在的公司,将低代码平台的使用规划到业务体系中;后来

  5. ruby - 我可以使用 RSpec 模拟标准输入/标准输出来测试控制台读写吗? - 2

    我的Ruby程序从stdin读取行并使用puts打印到stdout(终端)。我可以使用RSpec来测试读写吗?我可以像在stdin中编写的那样向我的程序注入(inject)一个字符串,同时检查输出吗?line=STDIN.read.chomp.split另外,我在一个循环中进行读取和写入,直到line[0]被“退出”。我可以在循环运行时进行测试,还是应该调用subject.read_in和subject.write_out? 最佳答案 您可以使用模拟并通过在and_return()方法中列出多个值来多次调用该方法。这些将按照给定的顺

  6. 多线程问题:为什么不应该使用多线程读写同一个socket连接? - 2

    问题的产生经典的单reactor多线程模式采用的是用主线程处理连接事件以及socket读写事件,业务逻辑的处理则是让线程池里的线程各自竞争处理。既然多线程这么方便,为什么不让线程池里的线程也参与到read和send这个过程中呢?在发送数据的过程中,即使TCP的发送缓存满了,我们也可以记录下当前成功发送了多少字节,然后再次注册一个EPOLLOUT事件,只需等待下次可写事件,继续让子线程发送数据即可,岂不是美哉?解释陈硕大佬的解释对于TCP,通常多线程读写同一个socket是错误的设计,因为有shortwrite的可能。假如你加锁,而又发生shortwrite,你是不是要一直等到整条消息发送完才解

  7. ruby - 在不破坏 anchor 和别名的情况下读写 YAML 文件? - 2

    我需要打开一个YAML文件,其中使用了别名:defaults:&defaultsfoo:barzip:buttonnode:这显然扩展为等效的YAML文档:defaults:foo:barzip:buttonnode:foo:otherzip:buttonYAML::load将其读取为。我需要在此YAML文档中设置新键,然后将其写回磁盘,尽可能保留原始结构。我看过YAML::Store,但这完全破坏了别名和anchor。是否有任何可用的东西:thing=Thing.load("config.yml")thing[:node][:foo]="yetanother"将文档另存为:defau

  8. javascript - 我如何使用 Meteor 读写文件到服务器? - 2

    我正在Meteor中开发NoDBCMS,但我对Meteor和JavaScript框架都是新手。如何在服务器上读写文件? 最佳答案 在Nodefs模块中你有一个writeFile功能。getUser=Meteor.users.findOne({_id:Meteor.userId()});userObject=JSON.stringify(getUser);varpath=process.env["PWD"]+"/public/";fs.writeFile(process.env["PWD"]+"/public/"+Meteor.use

  9. 【USB】Android实现读写USB串口数据 - 2

    最近在研究USB方面的内容;先后做了关于Android读写HID、串口设备的DEMO。本文比较简单,主要介绍的是Android实现读取串口数据的功能废话不多说,先看一下业务层是如何调用的;如图:首先,监听USB连接状况,当USB进行请求USB权限,当USB权限申请成功,进行调用打开Usb设备的方法;当监听到USB断开,进行关闭连接;这是向串口写入数据的方法;本DEMO主要使用Handle进行数据各个线程之间的数据传到,以及USB连接读写情况的反馈;下面直接上代码:连接USB设备的代码publicvoidopenCDC(UsbDeviceusbDevice,UsbDeviceConnection

  10. javascript - phonegap读写json文件 - 2

    我希望在Phonegap(Cordova)应用程序中将JSON文件本地存储在IOS/Android上。基本上,我从服务器($.GETJSON)检索一个JSON文件,我想先存储该JSON文件,然后检索和修改它。我查看了FileWriter,但没有看到mimetype...唯一的示例给出了文本文件。提前致谢!尼克 最佳答案 尼克,就用FileWriter.write将您的JSON数据保存到磁盘。JSON无论如何都是基于文本的文件,因此无需设置mime类型。当您准备好再次加载文件时,请使用FileReader.readAsText.在Fi

随机推荐