Spin
An x86(_64) spinlock
Install / Use
/learn @tinylib/SpinREADME
spin
Spin provides a simple spinlock.
Usage
Since goroutines blocking on a spinlock don't accomplish any useful work while they are blocked (as opposed to goroutines blocked on a sync.Mutex, which yield to runnable goroutines), a spinlock should only be used to protect very small operations.
Here's an example of a goroutine-safe data structure that keeps track of two integers that are always written and read atomically:
type Container struct {
one int
two int
lock uint32
}
func (c *Container) Get() (one int, two int) {
spin.Lock(&c.lock)
one, two = c.one, c.two
spin.Unlock(&c.lock)
return
}
func (c *Container) Set(one int, two int) {
spin.Lock(&c.lock)
c.one, c.two = one, two
spin.Unlock(&c.lock)
}
Since we're using the lock to protect only two loads/stores, the overhead of yielding a goroutine to the scheduler is large compared to the time of the operation, and thus a spinlock is a more efficient way to serialize access to the container's fields.
Related Skills
node-connect
342.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
84.7kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
342.0kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
84.7kCommit, push, and open a PR
