parent
95e2899e8a
commit
14203b8fa3
@ -0,0 +1,61 @@
|
|||||||
|
package stario
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"sync/atomic"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_Circle(t *testing.T) {
|
||||||
|
buf := NewStarBuffer(2048)
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
//fmt.Println("write start")
|
||||||
|
buf.Write([]byte("中华人民共和国\n"))
|
||||||
|
//fmt.Println("write success")
|
||||||
|
time.Sleep(time.Millisecond * 50)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
cpp := ""
|
||||||
|
go func() {
|
||||||
|
time.Sleep(time.Second * 3)
|
||||||
|
for {
|
||||||
|
cache := make([]byte, 64)
|
||||||
|
ints, err := buf.Read(cache)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("read error", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if ints != 0 {
|
||||||
|
cpp += string(cache[:ints])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
time.Sleep(time.Second * 13)
|
||||||
|
fmt.Println(cpp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_Circle_Speed(t *testing.T) {
|
||||||
|
buf := NewStarBuffer(1048976)
|
||||||
|
count := uint64(0)
|
||||||
|
for i := 1; i <= 10; i++ {
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
buf.putByte('a')
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
for i := 1; i <= 10; i++ {
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
_,err:=buf.getByte()
|
||||||
|
if err == nil {
|
||||||
|
atomic.AddUint64(&count, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
time.Sleep(time.Second * 10)
|
||||||
|
fmt.Println(count)
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
package stario
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WaitGroup struct {
|
||||||
|
wg *sync.WaitGroup
|
||||||
|
maxCount uint32
|
||||||
|
allCount uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewWaitGroup(maxCount int) WaitGroup {
|
||||||
|
return WaitGroup{wg: &sync.WaitGroup{}, maxCount: uint32(maxCount)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (swg *WaitGroup) Add(delta int) {
|
||||||
|
var Udelta uint32
|
||||||
|
if delta < 0 {
|
||||||
|
Udelta = uint32(-delta - 1)
|
||||||
|
} else {
|
||||||
|
Udelta = uint32(delta)
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
allC := atomic.LoadUint32(&swg.allCount)
|
||||||
|
if atomic.LoadUint32(&swg.maxCount) == 0 || atomic.LoadUint32(&swg.maxCount) >= allC+uint32(delta) {
|
||||||
|
if delta < 0 {
|
||||||
|
atomic.AddUint32(&swg.allCount, ^uint32(Udelta))
|
||||||
|
} else {
|
||||||
|
atomic.AddUint32(&swg.allCount, uint32(Udelta))
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
time.Sleep(time.Microsecond)
|
||||||
|
}
|
||||||
|
swg.wg.Add(delta)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (swg *WaitGroup) Done() {
|
||||||
|
swg.Add(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (swg *WaitGroup) Wait() {
|
||||||
|
swg.wg.Wait()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (swg *WaitGroup) GetMaxWaitNum() int {
|
||||||
|
return int(atomic.LoadUint32(&swg.maxCount))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (swg *WaitGroup) SetMaxWaitNum(num int) {
|
||||||
|
atomic.AddUint32(&swg.maxCount, uint32(num))
|
||||||
|
}
|
Loading…
Reference in New Issue