代码拉取完成,页面将自动刷新
package gobase
/***
fifo queue
*/
import "sync"
type SyncQueue struct {
lock *sync.RWMutex
dlist *DLinklist
}
func NewSyncQueue() *SyncQueue {
rval := &SyncQueue{
lock: new(sync.RWMutex),
dlist: NewDlinklist(),
}
return rval
}
func (this *SyncQueue) Count() int32 {
this.lock.RLock()
defer this.lock.RUnlock()
return this.dlist.cnt
}
func (this *SyncQueue) Reset() {
this.lock.Lock()
defer this.lock.Unlock()
for {
node := this.dlist.RemoveFirst()
if node != nil {
node.Value = nil
node.release2Pool() // 归还node
}
if node == nil {
break
}
}
}
func (this *SyncQueue) Push(val interface{}) {
node := NewDlinknodeFromPool()
node.Value = val
this.lock.Lock()
defer this.lock.Unlock()
this.dlist.Append(node)
}
/**
* Peek第一个
*/
func (this *SyncQueue) Peek() (bool, interface{}) {
this.lock.RLock()
defer this.lock.RUnlock()
node := this.dlist.SeekFirst()
if node != nil {
rval := node.Value // 暂存
return true, rval
} else {
return false, nil
}
}
/**
* 弹出第一个
*/
func (this *SyncQueue) Pop() (bool, interface{}) {
this.lock.Lock()
defer this.lock.Unlock()
node := this.dlist.RemoveFirst()
if node != nil {
rval := node.Value // 暂存
node.Value = nil
node.release2Pool() // 归还node
return true, rval
} else {
return false, nil
}
}
/**
* 取多个任务, 一般在回调中执行
*/
func (this *SyncQueue) PopTaskArgMaxFunc(max int, cb func(args interface{}) bool) int {
i := 0
for i < max {
if ok, val := this.Pop(); ok {
i++
if !cb(val) {
break
}
} else {
break
}
}
return i
}
/*
**
先获取所有的节点后, 再进行遍历, 避免产生死锁
*/
func (this *SyncQueue) Range(cb func(idx int, value interface{}, removeit *bool) bool) {
this.lock.RLock()
lst := this.dlist.Nodes()
this.lock.RUnlock()
removeit := false
for i := 0; i < len(lst); i++ {
removeit = false
node := lst[i]
ret := cb(i, node.Value, &removeit)
if removeit {
this.lock.Lock()
if this.dlist.Remove(node) {
node.Value = nil
node.release2Pool()
}
this.lock.Unlock()
}
if !ret {
break
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。