当前位置: 首页 > news >正文

网站备案 个人网站建设的分阶段步骤

网站备案 个人,网站建设的分阶段步骤,潍坊网站建设 世纪环球16楼,潍坊网站建设选聚搜网络好go读写锁的实现原理 1、RWMutex读写锁的概念 读写锁也就是我们所使用的RWMutex#xff0c;其实是对于go本身的mutex做的一个拓展#xff0c;当一个goroutine获得了读锁后#xff0c;其他goroutine同样可以获得读锁#xff0c;但是不能获得写锁。相反#xff0c;当一个go…go读写锁的实现原理 1、RWMutex读写锁的概念 读写锁也就是我们所使用的RWMutex其实是对于go本身的mutex做的一个拓展当一个goroutine获得了读锁后其他goroutine同样可以获得读锁但是不能获得写锁。相反当一个goroutine获得了写锁其他goroutine既不能读也不能写互斥的概念。 2、使用场景 适用于读多写少的情况 3、底层实现 读写锁实现的结构体位于src下的sync包下的rwmutex.go文件中 type RWMutex struct {w Mutex // held if there are pending writerswriterSem uint32 // semaphore for writers to wait for completing readersreaderSem uint32 // semaphore for readers to wait for completing writersreaderCount int32 // number of pending readersreaderWait int32 // number of departing readers } w字段代表着复用了互斥锁 writerSem代表写信号量用于写等待读 readerSem代表读信号量用于读等待写 readerCount代表当前执行读的goroutine数量 readerWait代表被阻塞的准备读的goroutine的数量 4、读锁的实现 加读锁 func (rw *RWMutex) RLock() {if atomic.AddInt32(rw.readerCount, 1) 0 {// A writer is pending, wait for it.runtime_SemacquireMutex(rw.readerSem, false, 0)} }首先看这个if方法为什么要判断小于0呢 atomic.AddInt32(rw.readerCount, 1) 0调用的这个原子方法目的就是当goroutine加读锁的时候读锁数量1如果返回的数量是负数那么就代表了当前有其他写锁这个时候就掉用runtime_SemacquireMutex方法休眠当前goroutinereaderSem就记录者这个goroutine。所以要判断是否小于0 释放读锁 // RUnlock undoes a single RLock call; // it does not affect other simultaneous readers. // It is a run-time error if rw is not locked for reading // on entry to RUnlock. func (rw *RWMutex) RUnlock() {if r : atomic.AddInt32(rw.readerCount, -1); r 0 {// Outlined slow-path to allow the fast-path to be inlinedrw.rUnlockSlow(r)} }释放读锁的时候就是对readerCount读数量-1即可如果返回值小于0就代表着当前有写的操作这个时候就会调用rUnlockSlow进入慢速通道 什么是慢速通道 func (rw *RWMutex) rUnlockSlow(r int32) {// A writer is pending.if atomic.AddInt32(rw.readerWait, -1) 0 {// The last reader unblocks the writer.runtime_Semrelease(rw.writerSem, false, 1)} }被阻塞的准备读的goroutine数量-1如果readerWait为0就表示当前没有goroutine正在准备读这个时候去唤醒写操作 5、写锁的实现 加写锁 const rwmutexMaxReaders 1 30 // Lock locks rw for writing. // If the lock is already locked for reading or writing, // Lock blocks until the lock is available. func (rw *RWMutex) Lock() {// First, resolve competition with other writers.rw.w.Lock()// Announce to readers there is a pending writer.r : atomic.AddInt32(rw.readerCount, -rwmutexMaxReaders) rwmutexMaxReaders// Wait for active readers.if r ! 0 atomic.AddInt32(rw.readerWait, r) ! 0 {runtime_SemacquireMutex(rw.writerSem, false, 0)} }写锁的调用就是调用互斥锁w的lock如果计算之后还是有其他goroutine持有读锁那么就调用runtime_SemacquireMutex休眠当前的goroutine等待所有的读操作完成 atomic.AddInt32(rw.readerCount, -rwmutexMaxReaders) rwmutexMaxReaders这个操作目的是防止后面的goroutine拿到读锁阻塞读的作用。 释放写锁 // Unlock unlocks rw for writing. It is a run-time error if rw is // not locked for writing on entry to Unlock. // // As with Mutexes, a locked RWMutex is not associated with a particular // goroutine. One goroutine may RLock (Lock) a RWMutex and then // arrange for another goroutine to RUnlock (Unlock) it. func (rw *RWMutex) Unlock() {// Announce to readers there is no active writer.r : atomic.AddInt32(rw.readerCount, rwmutexMaxReaders)if r rwmutexMaxReaders {race.Enable()fatal(sync: Unlock of unlocked RWMutex)}// Unblock blocked readers, if any.for i : 0; i int(r); i {runtime_Semrelease(rw.readerSem, false, 0)}// Allow other writers to proceed.rw.w.Unlock() }当释放写锁的时候首先会通过atomic.AddInt32(rw.readerCount, rwmutexMaxReaders)恢复之前的写入的很大的那个负数然后看当前有多少个读操作在等待循环唤醒等待读的goroutine 注意go中的锁不支持可重入锁若想实现可自定义实现 6、总结 读写锁区分读锁和写锁而普通的互斥锁不区分读写锁主要应用在读多写少的场景既保证了并发读的执行效率又保证了线程之间的安全。
http://www.dnsts.com.cn/news/41132.html

相关文章:

  • php工具箱是直接做网站的吗信息网站建设费使用年限
  • 企业电商网站开发步骤1
  • 有关做美食的网站乐网站排名配色
  • 创建网站需要什么仿制网站侵权行为
  • 比较大网站建设公司做网站膜网站怎么做
  • 网站建设项目资金申请ppt制作网站
  • 个人网站设计wordpress无法点上传图片
  • 上海网站建设86215海口网约车平台
  • 朝阳住房和城乡建设厅网站成都网站建设公司哪家好
  • 天津网站建设制作整合营销的四个层次
  • 嘉兴网站制作套餐有域名怎么建立网站
  • 网站毕业设计选题亚马逊网站怎么做推广
  • 千海网站建设 小程序天津网站制作推广
  • 石家庄网站建设公司怎么样购物网站开发方案
  • 阿里云自助建站和华为云自助建站行业网站做不下去
  • 购物网站建设信息企业内训机构
  • 瀑布流网站有哪些建工网查询
  • 做网站运营有提成吗资源下载网站源码
  • 六盘水南宁网站建设携程网站建设目的
  • 海珠做网站公司群晖外网访问wordpress时格式变完
  • 2022好项目免加盟费seo两个域名一个网站有影响
  • 有设计感的网站wordpress 短信 插件
  • 建设网站的意义作用是什么意思百度收录网站方法
  • 吉林品牌网站建设商家广告宣传册制作公司
  • 公司网站服务器选择西安有哪些家做网站的公司
  • 绍兴网站设计合肥企业网站制作
  • 订阅号可以做网站吗汕头老城区是什么区
  • 检测 网站优化网站的优点和缺点
  • 网站建设课程心得体会汉化wordpress主题
  • 哪个网站可以做前端项目网页设计在线培训网站有哪些