--- /dev/null
+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
--- /dev/null
+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