mirror of
https://gitee.com/johng/gf
synced 2026-06-07 10:22:11 +08:00
update rwmutex test2
This commit is contained in:
@ -7,32 +7,132 @@
|
||||
package rwmutex_test
|
||||
|
||||
import (
|
||||
"github.com/gogf/gf/g/container/garray"
|
||||
"github.com/gogf/gf/g/internal/rwmutex"
|
||||
"github.com/gogf/gf/g/test/gtest"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestRwmutex(t *testing.T) {
|
||||
func TestRwmutexIsSafe(t *testing.T) {
|
||||
gtest.Case(t, func() {
|
||||
lock := rwmutex.New()
|
||||
lock.Lock()
|
||||
lock.Unlock()
|
||||
lock.RLock()
|
||||
lock.RUnlock()
|
||||
gtest.Assert(lock.IsSafe(), true)
|
||||
|
||||
safeLock1 := rwmutex.New(false)
|
||||
safeLock1.Lock()
|
||||
safeLock1.Unlock()
|
||||
safeLock1.RLock()
|
||||
safeLock1.RUnlock()
|
||||
gtest.Assert(safeLock1.IsSafe(), true)
|
||||
lock = rwmutex.New(false)
|
||||
gtest.Assert(lock.IsSafe(), true)
|
||||
|
||||
unsafeLock1 := rwmutex.New(true)
|
||||
unsafeLock1.Lock()
|
||||
unsafeLock1.Unlock()
|
||||
unsafeLock1.RLock()
|
||||
unsafeLock1.RUnlock()
|
||||
gtest.Assert(unsafeLock1.IsSafe(), false)
|
||||
lock = rwmutex.New(false, false)
|
||||
gtest.Assert(lock.IsSafe(), true)
|
||||
|
||||
lock = rwmutex.New(true, false)
|
||||
gtest.Assert(lock.IsSafe(), false)
|
||||
|
||||
lock = rwmutex.New(true, true)
|
||||
gtest.Assert(lock.IsSafe(), false)
|
||||
|
||||
lock = rwmutex.New(true)
|
||||
gtest.Assert(lock.IsSafe(), false)
|
||||
})
|
||||
}
|
||||
|
||||
func TestSafeRwmutex(t *testing.T) {
|
||||
gtest.Case(t, func() {
|
||||
safeLock := rwmutex.New()
|
||||
array := garray.New()
|
||||
|
||||
go func() {
|
||||
safeLock.Lock()
|
||||
array.Append(1)
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
array.Append(1)
|
||||
safeLock.Unlock()
|
||||
}()
|
||||
go func() {
|
||||
time.Sleep(10 * time.Millisecond)
|
||||
safeLock.Lock()
|
||||
array.Append(1)
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
array.Append(1)
|
||||
safeLock.Unlock()
|
||||
}()
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
gtest.Assert(array.Len(), 1)
|
||||
time.Sleep(80 * time.Millisecond)
|
||||
gtest.Assert(array.Len(), 3)
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
gtest.Assert(array.Len(), 3)
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
gtest.Assert(array.Len(), 4)
|
||||
})
|
||||
}
|
||||
|
||||
func TestSafeReaderRwmutex(t *testing.T) {
|
||||
gtest.Case(t, func() {
|
||||
safeLock := rwmutex.New()
|
||||
array := garray.New()
|
||||
|
||||
go func() {
|
||||
safeLock.RLock()
|
||||
array.Append(1)
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
array.Append(1)
|
||||
safeLock.RUnlock()
|
||||
}()
|
||||
go func() {
|
||||
time.Sleep(10 * time.Millisecond)
|
||||
safeLock.RLock()
|
||||
array.Append(1)
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
array.Append(1)
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
array.Append(1)
|
||||
safeLock.RUnlock()
|
||||
}()
|
||||
go func() {
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
safeLock.Lock()
|
||||
array.Append(1)
|
||||
safeLock.Unlock()
|
||||
}()
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
gtest.Assert(array.Len(), 2)
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
gtest.Assert(array.Len(), 3)
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
gtest.Assert(array.Len(), 4)
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
gtest.Assert(array.Len(), 6)
|
||||
})
|
||||
}
|
||||
|
||||
func TestUnsafeRwmutex(t *testing.T) {
|
||||
gtest.Case(t, func() {
|
||||
unsafeLock := rwmutex.New(true)
|
||||
array := garray.New()
|
||||
|
||||
go func() {
|
||||
unsafeLock.Lock()
|
||||
array.Append(1)
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
array.Append(1)
|
||||
unsafeLock.Unlock()
|
||||
}()
|
||||
go func() {
|
||||
time.Sleep(10 * time.Millisecond)
|
||||
unsafeLock.Lock()
|
||||
array.Append(1)
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
array.Append(1)
|
||||
unsafeLock.Unlock()
|
||||
}()
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
gtest.Assert(array.Len(), 2)
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
gtest.Assert(array.Len(), 3)
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
gtest.Assert(array.Len(), 3)
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
gtest.Assert(array.Len(), 4)
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user