Golang 可见性或 CPU 线程缓存问题

Posted

技术标签:

【中文标题】Golang 可见性或 CPU 线程缓存问题【英文标题】:Golang visibility or CPU thread cache issue 【发布时间】:2019-05-24 10:35:49 【问题描述】:

1) golang 如何解决可见性问题?

2) 下面的代码有什么问题吗?

package main

type Service struct 
    stop bool


func (s *Service) Run() 
    for !s.stop 
        //Some logic
    


func (s *Service) Stop() 
    s.stop = true


func main() 
    s := &Service
    go s.Run()
    //Some logic
    s.Stop()

【问题讨论】:

您的代码非常不完整。很难判断它是否还有其他问题。 1) 内存栅栏,使用互斥体 golang.org/pkg/sync/atomic 至于 2) 是的,使用通道、互斥体或原子 @Flimzy 感谢您的评论,添加了停止功能 @Maksym 是的。它有一个数据竞赛。此外,您的主 goroutine(执行 main)运行到结束并杀死进程中的另一个 goroutine。 "golang 如何解决可见性问题?" “可见性问题”是什么意思? 【参考方案1】:

在这种情况下,我建议使用context.WithCancel 来停止 goroutine。

【讨论】:

以上是关于Golang 可见性或 CPU 线程缓存问题的主要内容,如果未能解决你的问题,请参考以下文章

到底什么是内存可见性?

java多线程进阶可见性

Java并发理论基础

volatile为什么可以保证内存可见性及防止指令重排序?

CSS 可见性或显示?

java内存模型的理解