不评价你的遭遇
但是代码里面问题不少
最大的问题是思维方式
用c/c++的思维习惯来套用在go上,必然是费力不讨好
这个事情用channel解决不是更简单清晰吗?
另外,Lock和Unlock里面显然是有竞态条件的
简单一个,SwapPointer不和LoadPointer配对使用就会带来问题
处理流程上也会产生竞态,比如那个nr的用法
另外
你可以把代码转到golang或者programming版面
【 在 zylthinking2 (zylthinking) 的大作中提到: 】
: 标 题: Re: 大家看一下, 这样的代码水平如何
: 发信站: 水木社区 (Wed Feb 3 19:54:12 2021), 站内
:
: 这是一个可以防止多个并发干一件事的锁
: 能达到的语义是允许其中一个干, 然后可以将干的结果分享给其他的
: 比如 10 个并发读同一个文件, 就可以让其中一个读, 其他的只取其读到的内容
:
:
: package goc
:
: import (
: "sync"
: "sync/atomic"
: "unsafe"
: )
:
: type cond struct {
: uptr unsafe.Pointer
: mux sync.Mutex
: cond *sync.Cond
: }
:
: func newCond() *cond {
: cond := &cond{}
: cond.cond = sync.NewCond(&cond.mux)
: return cond
: }
:
: func (this *cond) wait() {
: this.mux.Lock()
: for this.uptr == nil {
: this.cond.Wait()
: }
: this.mux.Unlock()
: }
:
: func (this *cond) wake(uptr unsafe.Pointer) {
: this.mux.Lock()
: this.uptr = uptr
: this.mux.Unlock()
: this.cond.Broadcast()
: }
:
: type LeadLock struct {
: nr int64
: cond *cond
: holder *cond
: mux sync.Mutex
: }
:
: func NewLeadLock() *LeadLock {
: leadlock := &LeadLock{}
: leadlock.cond = newCond()
: return leadlock
: }
:
: func (this *LeadLock) Lock() unsafe.Pointer {
: var uptr unsafe.Pointer
: n := atomic.AddInt64(&this.nr, 1)
: ptr := (*unsafe.Pointer)(unsafe.Pointer(&this.cond))
: if n > 1 {
: cond := (*cond)(atomic.LoadPointer(ptr))
: cond.wait()
: uptr = cond.uptr
: } else {
: this.mux.Lock()
: atomic.StoreInt64(&this.nr, 0)
: this.holder = (*cond)(atomic.SwapPointer(ptr, unsafe.Pointer(newCond())))
: }
: return uptr
: }
:
: func (this *LeadLock) Unlock(uptr unsafe.Pointer) {
: ptr := unsafe.Pointer(&this.holder)
: holder := atomic.SwapPointer((*unsafe.Pointer)(ptr), unsafe.Pointer(nil))
: if holder == nil {
: return
: }
: (*cond)(holder).wake(uptr)
: this.mux.Unlock()
: }
:
: 【 在 zylthinking2 的大作中提到: 】
: : 值不值一个360 T7级别
: : 真是心寒了
: : 难道 43 岁就真的要窝窝囊囊被人欺负?
: : ...................
:
: --
: 她就只是反复的向人说她悲惨的故事,常常引住了三五个人来听她。但不久,大家也都听得纯熟了,便是最慈悲的念佛的老太太们,眼里也再不见有一点泪的痕迹。后来全镇的人们几乎都能背诵她的话,一听到就烦厌得头痛。
: “我真傻,真的,”她开首说。
: “是的,你是单知道雪天野兽在深山里没有食吃,才会到村里来的。”他们立即打断她的话,走开去了。
:
: ※ 来源:·水木社区
http://www.newsmth.net·[FROM: 220.181.41.*]
--
FROM 111.203.245.*