aboutsummaryrefslogtreecommitdiff
path: root/bench_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'bench_test.go')
-rw-r--r--bench_test.go86
1 files changed, 0 insertions, 86 deletions
diff --git a/bench_test.go b/bench_test.go
index da2bf97..82aaba1 100644
--- a/bench_test.go
+++ b/bench_test.go
@@ -149,89 +149,3 @@ func BenchmarkPingPong(b *testing.B) {
b.ReportAllocs()
parallelPingPongs(b, 1)
}
-
-const maxTokens = 25
-
-func BenchmarkThunderingHerdCondVar(b *testing.B) {
- for i := 0; i < b.N; i++ {
- var mu sync.Mutex
- consumer := sync.NewCond(&mu)
- generator := sync.NewCond(&mu)
- done := false
- tokens := 0
- var pending sync.WaitGroup
- for range iter.N(1000) {
- pending.Add(1)
- go func() {
- mu.Lock()
- for {
- if tokens > 0 {
- tokens--
- generator.Signal()
- break
- }
- consumer.Wait()
- }
- mu.Unlock()
- pending.Done()
- }()
- }
- go func() {
- mu.Lock()
- for !done {
- if tokens < maxTokens {
- tokens++
- consumer.Signal()
- } else {
- generator.Wait()
- }
- }
- mu.Unlock()
- }()
- pending.Wait()
- mu.Lock()
- done = true
- generator.Signal()
- mu.Unlock()
- }
-
-}
-
-func BenchmarkThunderingHerd(b *testing.B) {
- for i := 0; i < b.N; i++ {
- done := NewBuiltinEqVar(false)
- tokens := NewBuiltinEqVar(0)
- pending := NewBuiltinEqVar(0)
- for range iter.N(1000) {
- Atomically(VoidOperation(func(tx *Tx) {
- tx.Set(pending, tx.Get(pending).(int)+1)
- }))
- go func() {
- Atomically(VoidOperation(func(tx *Tx) {
- t := tx.Get(tokens).(int)
- if t > 0 {
- tx.Set(tokens, t-1)
- tx.Set(pending, tx.Get(pending).(int)-1)
- } else {
- tx.Retry()
- }
- }))
- }()
- }
- go func() {
- for Atomically(func(tx *Tx) interface{} {
- if tx.Get(done).(bool) {
- return false
- }
- tx.Assert(tx.Get(tokens).(int) < maxTokens)
- tx.Set(tokens, tx.Get(tokens).(int)+1)
- return true
- }).(bool) {
- }
- }()
- Atomically(VoidOperation(func(tx *Tx) {
- tx.Assert(tx.Get(pending).(int) == 0)
- }))
- AtomicSet(done, true)
- }
-}