This Go package enables a large number of mutexes to be stored and accessed based on namespaces.
package main
import (
"fmt"
"strconv"
"sync"
namespacedMutex "github.com/theTardigrade/golang-namespacedMutex"
)
var mutexManager = namespacedMutex.New(&namespacedMutex.Options{
BucketCount: 1 << 5,
BucketCountShouldBePrime: true,
})
func main() {
numbers := make([]string, 0, 100)
var wg sync.WaitGroup
wg.Add(cap(numbers))
for i := 1; i <= cap(numbers); i++ {
go func(i int) {
defer wg.Done()
// when the Use function is called, a mutex stored
// under the namespace will automatically be locked
// before the handler function runs, and unlocked
// once it's finished
mutexManager.Use(false, "this-is-the-namespace", func() {
numbers = append(numbers, strconv.Itoa(i))
})
}(i)
}
wg.Wait()
wg.Add(len(numbers))
var numbersList string
for i := 0; i < len(numbers); i++ {
go func(i int) {
defer wg.Done()
// you can also use a mutex directly by calling
// the GetLocked function
mutex := mutexManager.GetLocked(false, "another-namespace")
defer mutex.Unlock()
numbersList += "(" + numbers[i] + ")"
}(i)
}
wg.Wait()
fmt.Println(numbersList)
fmt.Println(len(numbers))
}
If you use this package, or find any value in it, please consider donating: