@@ -102,6 +102,8 @@ type Buff struct {
102102 debug bool
103103 readLockName string
104104 writeLockName string
105+ L sync.RWMutex
106+ close bool
105107}
106108
107109// execute runner
@@ -116,7 +118,11 @@ func (b *Buff) SendMsgRunner() chan<- bool {
116118 case msg := <- b .send :
117119 b .pushMsgWithLock (msg )
118120 case <- done :
121+ b .L .Lock ()
119122 close (b .send )
123+ b .close = true
124+ b .L .Unlock ()
125+
120126 s := make (chan bool )
121127 go func () { // 等chan上的讯息处理完后才能关闭
122128 for len (b .send ) > 0 {
@@ -162,7 +168,11 @@ func (b *Buff) getIntervalLock() (ok bool) {
162168// add msg
163169// sendBuff满时,将堵塞
164170func (b * Buff ) Add (data interface {}) {
165- b .send <- data
171+ b .L .RLock ()
172+ defer b .L .RUnlock ()
173+ if ! b .close {
174+ b .send <- data
175+ }
166176}
167177
168178// 获取目前缓存上的资料
@@ -184,17 +194,17 @@ func (b *Buff) RLock() func() { // 怪怪的,打印频率有点怪
184194 if rdb .Exists (ctx , b .writeLockName ).Val () < 1 {
185195 break
186196 }
187- b .debugMsg ("[%s RLock] - 等待写锁释放\n " , b .cacheName )
197+ // b.debugMsg("[%s RLock] - 等待写锁释放\n", b.cacheName)
188198 time .Sleep (100 * time .Millisecond )
189199 }
190200
191201 t := time .Now ().Nanosecond ()
192202 rdb .Set (ctx , b .readLockName , t , b .rlockDuration )
193- b .debugMsg ("[%s RLock] - 获得读锁\n " , b .cacheName )
203+ // b.debugMsg("[%s RLock] - 获得读锁\n", b.cacheName)
194204 return func () {
195205 v , _ := strconv .Atoi (rdb .Get (ctx , b .readLockName ).Val ())
196206 if v == t {
197- b .debugMsg ("[%s RLock] - 释放读锁\n " , b .cacheName )
207+ // b.debugMsg("[%s RLock] - 释放读锁\n", b.cacheName)
198208 rdb .Del (ctx , b .readLockName )
199209 }
200210 }
@@ -206,21 +216,22 @@ func (b *Buff) lock() func() {
206216 if rdb .Exists (ctx , b .readLockName ).Val () < 1 {
207217 break
208218 }
209- b .debugMsg ("[%s Lock] - 等待读锁释放\n " , b .cacheName )
210- time .Sleep (100 * time .Second )
219+ // b.debugMsg("[%s Lock] - 等待读锁释放\n", b.cacheName)
220+ time .Sleep (100 * time .Millisecond )
211221 }
212222
213223 for {
214224 ok := rdb .SetNX (ctx , b .writeLockName , 1 , b .lockDuration ).Val ()
215225 if ok {
216- b .debugMsg ("[%s Lock] - 获得写锁\n " , b .cacheName )
226+ // b.debugMsg("[%s Lock] - 获得写锁\n", b.cacheName)
217227 break
218228 }
229+ // b.debugMsg("[%s Lock] - 读锁抢占失败\n", b.cacheName)
219230 time .Sleep (time .Millisecond * 50 )
220231 }
221232
222233 return func () {
223- b .debugMsg ("[%s Lock] - 释放写锁\n " , b .cacheName )
234+ // b.debugMsg("[%s Lock] - 释放写锁\n", b.cacheName)
224235 rdb .Del (ctx , b .writeLockName )
225236 }
226237}
0 commit comments