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

有没有设计网站在广州的海南网络广播电视台开学第一课

有没有设计网站在广州的,海南网络广播电视台开学第一课,广东住房与城乡建设厅网站,深圳网站建设服务文章目录 TryLock统计 goroutine数量读写锁读锁写锁常见死锁情况写锁重入写锁中调用读锁循环依赖 TryLock 源码中自带的(我的go是 1.20版本)TryLock 会尝试获取锁#xff0c;如果获取不到返回false#xff0c;并不会进行休眠阻塞(和 Lock的主要区别) func (m *Mutex) TryLo… 文章目录 TryLock统计 goroutine数量读写锁读锁写锁常见死锁情况写锁重入写锁中调用读锁循环依赖 TryLock 源码中自带的(我的go是 1.20版本)TryLock 会尝试获取锁如果获取不到返回false并不会进行休眠阻塞(和 Lock的主要区别) func (m *Mutex) TryLock() bool {old : m.state// 如果被锁或者进入饥饿模式直接放弃if old(mutexLocked|mutexStarving) ! 0 {return false}//竞争锁失败if !atomic.CompareAndSwapInt32(m.state, old, old|mutexLocked) {return false}if race.Enabled {race.Acquire(unsafe.Pointer(m))}return true }统计 goroutine数量 由于state 是sync.Mutex的第一个属性所以可以通过 unsafe.Pointer(m.Mutex) 获取state 含义请看文章 Go锁演进 (第一位代表锁状态第二位代表唤醒状态第三位代表饥饿状态其余代表goroutine数量) package mainimport (fmtsyncsync/atomictimeunsafe )const (mutexLocked 1 iota // mutex is lockedmutexWokenmutexStarvingmutexWaiterShift iota )type Mutex struct {sync.Mutex }//获取goroutine数 func (m *Mutex) GetGoroutineNumber() int {//由于state是sync.Mutex的第一个属性所以可以通过 unsafe.Pointer(m.Mutex) 获取val : atomic.LoadUint32((*uint32)(unsafe.Pointer(m.Mutex)))return int(valmutexLocked valmutexWaiterShift) }var m Mutexfunc main() {for i : 0; i 10; i {go func() {m.Lock()time.Sleep(2 * time.Second)m.Unlock()}()}go func() {ticker : time.NewTicker(1 * time.Second)defer ticker.Stop()for {select {case -ticker.C:fmt.Println(m.GetGoroutineNumber())}}}()time.Sleep(30 * time.Second) } 读写锁 读写锁采用的是写锁优先的模式当获取写锁时(T1时刻),如果在T1之前已经有goroutine获取到读锁, 写锁进入阻塞等待等待T1之前的读锁全部释放后再唤醒。T1之后的读锁会全部阻塞进入等待等待写锁释放在执行读锁 读锁 readerCount 为负数代表有写锁等待有写锁等待的情况下, readerCount 为负数readerWait 为正 (看读锁的 Lock 逻辑)在写锁等待的情况下, readerCount 1, readerWait -1 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 }func (rw *RWMutex) RLock() {//竞态忽略if race.Enabled {_ rw.w.staterace.Disable()}//如果当前的reader等待数 1 0,说明有写操作需要获取锁阻塞读等待唤醒if atomic.AddInt32(rw.readerCount, 1) 0 {runtime_SemacquireMutex(rw.readerSem, false, 0)}//竞态忽略if race.Enabled {race.Enable()race.Acquire(unsafe.Pointer(rw.readerSem))} }func (rw *RWMutex) RUnlock() {//竞态忽略if race.Enabled {_ rw.w.staterace.ReleaseMerge(unsafe.Pointer(rw.writerSem))race.Disable()}if r : atomic.AddInt32(rw.readerCount, -1); r 0 {//有写等待rw.rUnlockSlow(r)}//竞态忽略if race.Enabled {race.Enable()} }func (rw *RWMutex) rUnlockSlow(r int32) {//重复解锁情况下if r1 0 || r1 -rwmutexMaxReaders {race.Enable()throw(sync: RUnlock of unlocked RWMutex)}if atomic.AddInt32(rw.readerWait, -1) 0 {//如果写之前的读都完成了。那么写可以开始干活了runtime_Semrelease(rw.writerSem, false, 1)} }写锁 写锁获取锁之前发现还有读锁会将 readerCount - rwmutexMaxReaders 得到一个 负值 readerCount代表写锁等待写锁释放后会将 readerCount rwmutexMaxReaders 变成写锁等待状态 func (rw *RWMutex) Lock() {//竞态忽略if race.Enabled {_ rw.w.staterace.Disable()}//写锁复用的sync.Mutexrw.w.Lock()//变成负的来表示写操作要入场了 r : atomic.AddInt32(rw.readerCount, -rwmutexMaxReaders) rwmutexMaxReaders//读还在占用锁写还是需要等待,维护写操作需要等待的读操作数量(readerWait)if r ! 0 atomic.AddInt32(rw.readerWait, r) ! 0 {runtime_SemacquireMutex(rw.writerSem, false, 0)}//竞态忽略if race.Enabled {race.Enable()race.Acquire(unsafe.Pointer(rw.readerSem))race.Acquire(unsafe.Pointer(rw.writerSem))} }func (rw *RWMutex) Unlock() {//竞态忽略if race.Enabled {_ rw.w.staterace.Release(unsafe.Pointer(rw.readerSem))race.Disable()}//重复解锁r : atomic.AddInt32(rw.readerCount, rwmutexMaxReaders)if r rwmutexMaxReaders {race.Enable()throw(sync: Unlock of unlocked RWMutex)}//把写期间的goroutine给他调用了for i : 0; i int(r); i {runtime_Semrelease(rw.readerSem, false, 0)}// Allow other writers to proceed.rw.w.Unlock()//竞态忽略if race.Enabled {race.Enable()} }常见死锁情况 写锁重入 读写锁的的写锁是基于 sync.Mutex package mainimport (sync )var s sync.RWMutexfunc main() {s.Lock()s.Lock() }写锁中调用读锁 在 Rlock 后面的 Lock 会阻塞等待 RUnlock而 RUnlock又被 Lock阻塞故此死锁 s.RLock()s.Lock()s.RUnlock()s.Unlock()循环依赖 16 行程序开始获取到读锁(第一个读)27 行程序 1秒后写锁入场写锁依赖 16行中的Rlock(等待第一个读释放锁)18 行程序2秒后读锁入场读锁依赖27行的 Lock(等待写获取锁并释放)16 行程序想解锁依赖 18行的读锁 (等待第二个锁先释放(第二个读是在写锁等待之后入场所以会阻塞)然后才能释放第一个锁) 上面就是下面代码死锁流程 package mainimport (fmtsynctime )var s sync.RWMutex var w sync.WaitGroupfunc main() {w.Add(3)go func() {s.RLock()time.Sleep(2 * time.Second)s.RLock()w.Done()s.RUnlock()w.Done()s.RUnlock()}()go func() {time.Sleep(1 * time.Second)s.Lock()w.Done()s.Unlock()}()w.Wait()fmt.Println(凉凉) }
http://www.sczhlp.com/news/173335/

相关文章:

  • pandoc使用
  • netdata
  • c#造个轮子--GIF录制工具
  • 网络建站免费网址重庆企业做网站多少钱
  • 网站二级目录解析dw做aspx网站
  • 重庆建设网站建站网站模板的缺点
  • 个人网站建设价格表小程序设计流程
  • 普宁网站建设做商业网站要交税吗
  • 营销最好的网站建设公司python编程软件推荐
  • 上海建设行政主管部门网站网站开发教程 视频 ssh
  • 陕西恒发建设网站建官网公司地址
  • wordpress建站公司营销型企业网站功能
  • dede大气企业网站模板(一屏展示)苏州调查公司招聘信息
  • 如何做网站推广广告微信网站建设和维护
  • 建网站什么框架福建省建设招投标网站
  • 怎么做专门卖二手衣服的网站360网址大全
  • 织梦做旅游网站wordpress中搜索页面模板
  • 网站建设公司排名深圳湖南手机版建站系统开发
  • 玉环在哪里做网站wordpress 健身
  • 多语言外贸网站wordpress 用户打赏
  • 自己创建网站赚钱水墨风格的网站
  • 苏州网站设计公司简介豌豆荚下载
  • 做网站用什么软件展厅设计图片
  • 播视频网站开发官方网站建设平台
  • 不会写程序如何做网站网站静态页面生成
  • 网站开发方向c语言vps搭建wordpress博客
  • 响应式网站导航栏内容南京哪家做网站好
  • 网站优化 合同王野发动机怎么样
  • 做网站时,404网页如何指向义乌大岳网络科技有限公司
  • arc3.2语言sort的时候报错:(sort < `(2 9 3 7 5 1)) 得写成此种:(sort > (pair (list 3 2)))