首页 > 后端开发 > Golang > 如何安全地从并行 Go 例程读取共享数据?

如何安全地从并行 Go 例程读取共享数据?

Barbara Streisand
发布: 2025-01-02 14:31:39
原创
412 人浏览过

How to Safely Read Shared Data from Parallel Go Routines?

并行 Go 例程中从共享数据中读取值

问题:

Go 中如何安全读取数据来自并行计算中的单独线程?具体来说,如何在不影响数据完整性的情况下从工作线程收集数据?

场景:

主线程创建多个异步运行的工作实例。每 10 秒,主线程需要从工作线程收集值(例如迭代计数)并显示综合报告。

问题:

安全吗直接读取worker的值?此外,是否有其他方法可以有效地实现此要求?

答案:

直接从worker读取值是不安全的,因为它违反了Go的并发模型。在 Go 中,goroutine 之间共享的数据必须通过同步机制进行保护,以防止同时写入操作导致数据损坏。

为了解决这个问题,一种方法是使用sync.RWMutex 数据结构:

  • 写锁:worker修改共享数据时获得,保证独占
  • 读锁:读取共享数据时由主线程获取,允许并发读,但阻止写。

使用sync.RWMutex的示例实现:

type Worker struct {
    iterMu sync.RWMutex
    iter   int
}

func (w *Worker) Iter() int {
    w.iterMu.RLock()
    defer w.iterMu.RUnlock()
    return w.iter
}

func (w *Worker) setIter(n int) {
    w.iterMu.Lock()
    w.iter = n
    w.iterMu.Unlock()
}
登录后复制

或者,sync/atomic 包提供原子操作,确保线程安全访问共享变量。使用sync/atomic的示例实现:

type Worker struct {
    iter int64
}

func (w *Worker) Iter() int64 {
    return atomic.LoadInt64(&w.iter)
}

func (w *Worker) setIter(n int64) {
    atomic.StoreInt64(&w.iter, n)
}
登录后复制

通过利用这些方法,这两种方法都提供了一个强大的解决方案,可以从单独的线程读取值,同时保持数据完整性。

以上是如何安全地从并行 Go 例程读取共享数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板