From: qydysky Date: Thu, 27 Jul 2023 01:54:08 +0000 (+0800) Subject: add X-Git-Tag: v0.28.0+202307272ddbeb9 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=2ddbeb9fb36a3be537e0df8952bf53d624446ff2;p=part%2F.git add --- diff --git a/sync/RWMutex.go b/sync/RWMutex.go index f3f8b45..e2f2a93 100644 --- a/sync/RWMutex.go +++ b/sync/RWMutex.go @@ -93,11 +93,17 @@ func tof(to time.Duration) (inTimeCall func() (called bool)) { // // 不要在Rlock内设置变量,有DATA RACE风险 func (m *RWMutex) RLock(to ...time.Duration) (unlockf func()) { - _, rlcLoop := lcas(&m.rlc, ulock, rlock) - if e := rlcLoop(to...); e != nil { - panic(e) + if m.read.Add(1) == 1 { + _, rlcLoop := cas(&m.rlc, ulock, rlock) + if e := rlcLoop(to...); e != nil { + panic(e) + } + } else { + _, rlcLoop := lcas(&m.rlc, ulock, rlock) + if e := rlcLoop(to...); e != nil { + panic(e) + } } - m.read.Add(1) var callC atomic.Bool var done func() (called bool) if len(to) > 1 { diff --git a/sync/RWMutex_test.go b/sync/RWMutex_test.go index 7f45ccd..07644f9 100644 --- a/sync/RWMutex_test.go +++ b/sync/RWMutex_test.go @@ -14,6 +14,18 @@ func check(l *RWMutex, r, read int32) { } } +func Test0(t *testing.T) { + var l RWMutex + ul := l.RLock() + go func() { + l.Lock()() + }() + go func() { + l.RLock()() + }() + ul() +} + // ulock rlock rlock func Test1(t *testing.T) { var l RWMutex @@ -53,7 +65,7 @@ func Test3(t *testing.T) { ul := l.Lock() check(&l, lock, 0) time.AfterFunc(time.Second, func() { - check(&l, lock, 0) + check(&l, lock, 1) ul() }) c := time.Now() @@ -101,25 +113,6 @@ func Panic_Test5(t *testing.T) { check(&l, ulock, 0) } -// ulock lock rlock -func Test6(t *testing.T) { - var l RWMutex - ul := l.Lock() - check(&l, lock, 0) - time.AfterFunc(time.Second, func() { - check(&l, lock, 0) - ul() - }) - c := time.Now() - ul1 := l.RLock() - check(&l, rlock, 1) - if time.Since(c) < time.Second { - t.Fail() - } - ul1() - check(&l, ulock, 0) -} - func BenchmarkRlock(b *testing.B) { var lock1 RWMutex var a bool