From: qydysky Date: Mon, 22 Feb 2021 17:23:17 +0000 (+0800) Subject: tmplK或存在严重问题,使用funcCtrl替代 X-Git-Tag: v0.4.7~1 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=3395ef9ce3e02440d623d7fecab1b3a5513c6e2c;p=part%2F.git tmplK或存在严重问题,使用funcCtrl替代 --- diff --git a/funcCtrl/FuncCtrl.go b/funcCtrl/FuncCtrl.go new file mode 100644 index 0000000..be2563f --- /dev/null +++ b/funcCtrl/FuncCtrl.go @@ -0,0 +1,53 @@ +package part + +import ( + "sync" + "unsafe" + "sync/atomic" + "container/list" + idpool "github.com/qydysky/part/idpool" +) + +type SkipFunc struct{//新的跳过 + c unsafe.Pointer +} + +func (t *SkipFunc) NeedSkip() (result bool) { + return !atomic.CompareAndSwapPointer(&t.c, nil, unsafe.Pointer(&struct{}{})) +} + +func (t *SkipFunc) UnSet() { + atomic.CompareAndSwapPointer(&t.c, atomic.LoadPointer(&t.c), nil) +} + +type FlashFunc struct{//新的替换旧的 + b *list.List + pool *idpool.Idpool +} + +func (t *FlashFunc) Flash() (current uintptr) { + if t.pool == nil {t.pool = idpool.New()} + if t.b == nil {t.b = list.New()} + + e := t.pool.Get() + current = e.Id + t.b.PushFront(e) + + return +} + +func (t *FlashFunc) NeedExit(current uintptr) (bool) { + return current != t.b.Front().Value.(*idpool.Id).Id +} + +type BlockFunc struct{//新的等待旧的 + sync.Mutex +} + +func (t *BlockFunc) Block() { + t.Lock() +} + +func (t *BlockFunc) UnBlock() { + t.Unlock() +} \ No newline at end of file diff --git a/funcCtrl/FuncCtrl_test.go b/funcCtrl/FuncCtrl_test.go new file mode 100644 index 0000000..801cdae --- /dev/null +++ b/funcCtrl/FuncCtrl_test.go @@ -0,0 +1,51 @@ +package part + +import ( + "testing" + "time" +) + +func Test_SkipFunc(t *testing.T) { + var b SkipFunc + var a = func(i int){ + if b.NeedSkip() {return} + defer b.UnSet() + t.Log(i,`.`) + time.Sleep(time.Second) + t.Log(i,`..`) + } + t.Log(`just show 1 or 2 twice`) + go a(1) + go a(2) + time.Sleep(5*time.Second) +} + +func Test_FlashFunc(t *testing.T) { + var b FlashFunc + var a = func(i int){ + id := b.Flash() + t.Log(i,`.`) + time.Sleep(time.Second) + if b.NeedExit(id) {return} + t.Log(i,`.`) + } + t.Log(`show 1 or 2, then show the other twice`) + go a(1) + go a(2) + time.Sleep(5*time.Second) +} + +func Test_BlockFunc(t *testing.T) { + var b BlockFunc + var a = func(i int){ + b.Block() + defer b.UnBlock() + t.Log(i,`.`) + time.Sleep(time.Second) + t.Log(i,`.`) + } + t.Log(`show 1 and 2 twice`) + go a(1) + go a(2) + time.Sleep(5*time.Second) +} \ No newline at end of file