我正在实现一个并发的三色标记垃圾收集器,我看了一些帖子,里面描述的 1.14 之前,golang 无法强制停止 goroutine 从而无法启动开始 gc 。
我的疑问是,全局变量 runtime.writeBarrier 更新了之后,运行中的 goroutine 不就读到了 writeBarrier 并启动了写屏障么,为什么必须等待 goroutine 停止呢?
92 CMPL runtime.writeBarrier(SB), $0
99 JEQ 103
101 JMP 108
108 CALL runtime.gcWriteBarrier(SB)
---
更近一步,假设刚刚更新完读不到,那更新完等个几十 ms 还读不到么 🤔.
我的疑问是,全局变量 runtime.writeBarrier 更新了之后,运行中的 goroutine 不就读到了 writeBarrier 并启动了写屏障么,为什么必须等待 goroutine 停止呢?
92 CMPL runtime.writeBarrier(SB), $0
99 JEQ 103
101 JMP 108
108 CALL runtime.gcWriteBarrier(SB)
---
更近一步,假设刚刚更新完读不到,那更新完等个几十 ms 还读不到么 🤔.