浏览代码

add syncx.Guard func (#620)

Kevin Wan 4 年之前
父节点
当前提交
08fb980ad2
共有 2 个文件被更改,包括 23 次插入2 次删除
  1. 7 2
      core/syncx/barrier.go
  2. 16 0
      core/syncx/barrier_test.go

+ 7 - 2
core/syncx/barrier.go

@@ -9,7 +9,12 @@ type Barrier struct {
 
 // Guard guards the given fn on the resource.
 func (b *Barrier) Guard(fn func()) {
-	b.lock.Lock()
-	defer b.lock.Unlock()
+	Guard(&b.lock, fn)
+}
+
+// Guard guards the given fn with lock.
+func Guard(lock sync.Locker, fn func()) {
+	lock.Lock()
+	defer lock.Unlock()
 	fn()
 }

+ 16 - 0
core/syncx/barrier_test.go

@@ -38,3 +38,19 @@ func TestBarrierPtr_Guard(t *testing.T) {
 	wg.Wait()
 	assert.Equal(t, total, count)
 }
+
+func TestGuard(t *testing.T) {
+	const total = 10000
+	var count int
+	var lock sync.Mutex
+	wg := new(sync.WaitGroup)
+	wg.Add(total)
+	for i := 0; i < total; i++ {
+		go Guard(&lock, func() {
+			count++
+			wg.Done()
+		})
+	}
+	wg.Wait()
+	assert.Equal(t, total, count)
+}