| 23 | ) |
| 24 | |
| 25 | func TestNewStack(t *testing.T) { |
| 26 | req := require.New(t) |
| 27 | |
| 28 | // test 4 threads |
| 29 | s := NewStack() |
| 30 | m := NewHashMap() |
| 31 | wg := sync.WaitGroup{} |
| 32 | wg.Add(4) |
| 33 | for i := 0; i < 4; i++ { |
| 34 | go func(start, end int) { |
| 35 | for i := start; i < end; i++ { |
| 36 | s.Push(i) |
| 37 | } |
| 38 | for i := start; i < end; i++ { |
| 39 | m.Set(s.Pop(), nil) |
| 40 | } |
| 41 | wg.Done() |
| 42 | }(i*10000, (i+1)*10000) |
| 43 | } |
| 44 | wg.Wait() |
| 45 | req.Equal(0, s.Len()) |
| 46 | req.Nil(s.Pop()) |
| 47 | req.Equal(40000, m.Len()) |
| 48 | for i := 0; i < 40000; i++ { |
| 49 | v, ok := m.Get(i) |
| 50 | req.Nil(v) |
| 51 | req.True(ok) |
| 52 | } |
| 53 | } |
| 54 | |
| 55 | func BenchmarkLockfreeStack(b *testing.B) { |
| 56 | for i := 0; i < b.N; i++ { |