// 理论上最后队列中有1000个元素
// 有锁版有1002个
// 无锁版有960个
var wg sync.WaitGroup
// 有锁版环形队列对并发的支持
func case5() {
var cnt = 1000
var rq = ring_queue.NewRingQueueBlockRWLock(5 * cnt)
for i := 0; i < cnt*4; i++ {
var v = i
wg.Add(1)
if i % 4 == 0 {
go func() {
rq.LPop()
wg.Done()
}()
} else if i % 4 == 1{
go func() {
rq.Head()
wg.Done()
}()
} else {
go func() {
rq.LInsert(v)
wg.Done()
}()
}
}
wg.Wait()
fmt.Println(rq.Len()) // 1002
for !rq.Empty() {
fmt.Println(rq.Head())
rq.LPop()
}
}
// 无锁版环形队列对并发的支持
func case4() {
var cnt = 1000
var rq = ring_queue.NewRingQueueBlock(5 * cnt)
for i := 0; i < cnt*4; i++ {
var v = i
wg.Add(1)
if i % 4 == 0 {
go func() {
rq.LPop()
wg.Done()
}()
} else if i % 4 == 1{
go func() {
rq.Head()
wg.Done()
}()
} else {
go func() {
rq.LInsert(v)
wg.Done()
}()
}
}
wg.Wait()
fmt.Println(rq.Len()) // 960
for !rq.Empty() {
fmt.Println(rq.Head())
rq.LPop()
}
}