2 Star 2 Fork 8

王布衣/gox

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
spinlock.go 515 Bytes
一键复制 编辑 原始数据 按行查看 历史
王布衣 提交于 2年前 . 增加自旋锁
package coroutine
import (
"runtime"
"sync/atomic"
)
// SpinLock 自旋锁对象定义
type SpinLock uint32
const maxBackOff = 32
// Lock 加锁
//
// todo: 未加验证
func (sl *SpinLock) Lock() {
backoff := 1
// 自旋尝试获取锁
for !atomic.CompareAndSwapUint32((*uint32)(sl), 0, 1) {
for i := 0; i < backoff; i++ {
runtime.Gosched()
}
if backoff < maxBackOff {
backoff <<= 1
}
}
}
// UnLock 解锁
func (sl *SpinLock) UnLock() {
atomic.CompareAndSwapUint32((*uint32)(sl), 1, 0)
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/quant1x/gox.git
git@gitee.com:quant1x/gox.git
quant1x
gox
gox
v1.22.12

搜索帮助