forked from mirror/abool
First commit
This commit is contained in:
parent
03ac41ab6a
commit
b6b9ab38df
31
README.md
31
README.md
|
@ -1,2 +1,29 @@
|
|||
# abool
|
||||
Atomic boolean library for Golang, optimized for performance yet simple to use.
|
||||
# ABool
|
||||
:bulb: Atomic boolean library for Golang, optimized for performance yet simple to use.
|
||||
|
||||
## Benchmark:
|
||||
|
||||
- Golang 1.6.2
|
||||
- OS X 10.11.4
|
||||
|
||||
```
|
||||
# Read
|
||||
BenchmarkMutexRead-4 100000000 21.1 ns/op
|
||||
BenchmarkAtomicValueRead-4 200000000 6.33 ns/op
|
||||
BenchmarkAtomicBoolRead-4 300000000 4.28 ns/op
|
||||
|
||||
# Write
|
||||
BenchmarkMutexWrite-4 100000000 21.7 ns/op
|
||||
BenchmarkAtomicValueWrite-4 30000000 47.8 ns/op
|
||||
BenchmarkAtomicBoolWrite-4 200000000 9.83 ns/op
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
var v AtomicBool
|
||||
v.Set() // set to true
|
||||
v.IsSet() // returns true
|
||||
v.UnSet() // set to false
|
||||
v.SetTo(true) // set with gieven boolean
|
||||
```
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
package abool
|
||||
|
||||
import "sync/atomic"
|
||||
|
||||
// New creates a pointer to an AtomicBool
|
||||
func New() *AtomicBool {
|
||||
return new(AtomicBool)
|
||||
}
|
||||
|
||||
// AtomicBool is a atomic boolean
|
||||
// Note: When embedding into a struct, one should always use
|
||||
// *AtomicBool to avoid copy
|
||||
type AtomicBool int32
|
||||
|
||||
// SetTo sets the boolean with given bool
|
||||
func (ab *AtomicBool) SetTo(yes bool) {
|
||||
if yes {
|
||||
atomic.StoreInt32((*int32)(ab), 1)
|
||||
} else {
|
||||
atomic.StoreInt32((*int32)(ab), 0)
|
||||
}
|
||||
}
|
||||
|
||||
// Set sets the bool to true
|
||||
func (ab *AtomicBool) Set() {
|
||||
atomic.StoreInt32((*int32)(ab), 1)
|
||||
}
|
||||
|
||||
// UnSet sets the bool to false
|
||||
func (ab *AtomicBool) UnSet() {
|
||||
atomic.StoreInt32((*int32)(ab), 0)
|
||||
}
|
||||
|
||||
// IsSet returns whether the bool is true
|
||||
func (ab *AtomicBool) IsSet() bool {
|
||||
return atomic.LoadInt32((*int32)(ab)) == 1
|
||||
}
|
|
@ -0,0 +1,94 @@
|
|||
package abool
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestBool(t *testing.T) {
|
||||
v := New()
|
||||
if v.IsSet() {
|
||||
t.Fatal("Empty value of AtomicBool should be false")
|
||||
}
|
||||
|
||||
v.Set()
|
||||
if !v.IsSet() {
|
||||
t.Fatal("AtomicBool.Set() failed")
|
||||
}
|
||||
|
||||
v.UnSet()
|
||||
if v.IsSet() {
|
||||
t.Fatal("AtomicBool.UnSet() failed")
|
||||
}
|
||||
|
||||
v.SetTo(true)
|
||||
if !v.IsSet() {
|
||||
t.Fatal("AtomicBool.SetTo(true) failed")
|
||||
}
|
||||
|
||||
v.SetTo(false)
|
||||
if v.IsSet() {
|
||||
t.Fatal("AtomicBool.SetTo(false) failed")
|
||||
}
|
||||
}
|
||||
|
||||
// Benchmark Read
|
||||
|
||||
func BenchmarkMutexRead(b *testing.B) {
|
||||
var m sync.RWMutex
|
||||
var v bool
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
m.RLock()
|
||||
_ = v
|
||||
m.RUnlock()
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkAtomicValueRead(b *testing.B) {
|
||||
var v atomic.Value
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = v.Load() != nil
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkAtomicBoolRead(b *testing.B) {
|
||||
v := New()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = v.IsSet()
|
||||
}
|
||||
}
|
||||
|
||||
// Benchmark Write
|
||||
|
||||
func BenchmarkMutexWrite(b *testing.B) {
|
||||
var m sync.RWMutex
|
||||
var v bool
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
m.RLock()
|
||||
v = true
|
||||
m.RUnlock()
|
||||
}
|
||||
b.StopTimer()
|
||||
_ = v
|
||||
}
|
||||
|
||||
func BenchmarkAtomicValueWrite(b *testing.B) {
|
||||
var v atomic.Value
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
v.Store(true)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkAtomicBoolWrite(b *testing.B) {
|
||||
v := New()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
v.Set()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue