atomic.Value存储interface的问题

先看这段代码 import ( "io" "net/http" "sync/atomic" ) func main() { var v atomic.Value var err error err = &http.ProtocolError{} v.Store(err) err = io.EOF v.Store(err) } 运行后会报错 panic: sync/atomic: store of inconsistently typed value into Value。 原因是atomic.Value.Store需要类型是一致的。在这里err类型发生了变化,虽然他们都是error接口类型。具体参考Issues#22550 怎么解决?包装一层就能运行了。 type tValue[T any] struct { value T } func main() { var v atomic.Value var err error err = &http.ProtocolError{} v.Store(tValue[error]{err}) err = io.EOF v.Store(tValue[error]{err}) }

2024-06-26 · 1 分钟

关于Golang GC问题的思考

由于GC复杂,我也没有仔细研究过GC的源码,所以只能站在巨人的肩上学习,如果想了解GC的具体实现请移步文末的参考资料。本文只是记录我在阅读完大佬文章中自己的一些问题与思考,可能有一些不对的地方。欢迎大家一起讨论。 ...

2021-07-27 · 1 分钟

Timer源码阅读分享

这是在小团队里面的一次分享,以下是PPT内容

2021-07-10 · 1 分钟

Timer源码阅读

根据6.3 计时器中的描述,Golang Timer的设计经历了如下阶段: Go 1.9 版本之前,所有的计时器由全局唯一的四叉堆维护; Go 1.10 ~ 1.13,全局使用 64 个四叉堆维护全部的计时器,每个处理器(P)创建的计时器会由对应的四叉堆维护; Go 1.14 版本之后,每个处理器单独管理计时器并通过网络轮询器触发; Go 1.9 版本之前由于使用全局的四叉堆,在多核情况下会出现锁竞争导致性能问题 Go 1.10 ~ 1.13使用了64个四叉堆,有每个P来维护对应的四叉堆,相当于将锁的粒度减小,但是当timer在未到时间和到时间需要执行进行切换的时候,会发生P和M的绑定和解绑,尤其是当timer触发时间间隔比较小的情况下,会导致CPU占用过高,M/P切换的开销增加(TODO 为什么会发生P和M的绑定和解绑) Go 1.14 版本后每个P管理计时器四叉堆,由网络轮询器和调度器进行触发 我使用的是Go 1.16的版本进行分析 ...

2021-04-22 · 18 分钟