首次提交:初始化项目代码
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
// bulma/atomic_spinlock.go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
)
|
||||
|
||||
// SpinLock 自旋锁结构体(基于atomic.Bool实现)
|
||||
type SpinLock struct {
|
||||
flag atomic.Bool // false=未锁定,true=已锁定
|
||||
}
|
||||
|
||||
// Lock 加锁:自旋等待,直到获取锁
|
||||
func (l *SpinLock) Lock() {
|
||||
// CAS逻辑:尝试将flag从false改为true,失败则循环重试
|
||||
for l.flag.CompareAndSwap(false, true) {
|
||||
// 短暂休眠,避免忙等耗尽CPU(关键优化)
|
||||
time.Sleep(time.Nanosecond) // 避免忙等耗尽 CPU
|
||||
}
|
||||
}
|
||||
|
||||
// Unlock 解锁:将flag设为false,释放锁
|
||||
func (l *SpinLock) Unlock() {
|
||||
l.flag.Store(false)
|
||||
}
|
||||
|
||||
func main() {
|
||||
var lock SpinLock
|
||||
var counter atomic.Int32 // 原子计数器,配合自旋锁使用
|
||||
var wg sync.WaitGroup
|
||||
|
||||
// 10 个 goroutine 争抢自旋锁
|
||||
for i := 0; i < 10; i++ {
|
||||
wg.Add(1)
|
||||
go func(id int) {
|
||||
defer wg.Done()
|
||||
lock.Lock() // 获取自旋锁
|
||||
defer lock.Unlock() // 延迟解锁,避免锁泄露
|
||||
|
||||
counter.Add(1)
|
||||
fmt.Printf("Goroutine %d 完成计数\n", id)
|
||||
}(i)
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
fmt.Printf("✅ 最终计数: %d (应为 10)\n", counter.Load())
|
||||
}
|
||||
Reference in New Issue
Block a user