首页 >后端开发 >Golang >如何安全地读取 Go 中多个 Goroutine 的值?

如何安全地读取 Go 中多个 Goroutine 的值?

Patricia Arquette
Patricia Arquette原创
2024-12-25 05:03:21921浏览

How Can I Safely Read Values from Multiple Goroutines in Go?

在 Go 中从不同线程安全地读取值

在 Go 中,在没有适当同步的情况下从多个 goroutine 并发访问值是危险的。为了确保数据完整性,采用同步机制至关重要。

使用互斥锁和读/写锁进行同步

在给定场景中,主线程需要收集数据每 10 秒从工作线程获取一次值,通道是不够的。相反,可以使用读/写互斥锁。

工作线程在更新其值时将获取写锁,而主线程在检索值时将获取读锁。这可以防止竞争条件并保证数据一致性。

使用互斥体的示例实现

以下代码示例了使用互斥体的简单实现:

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 包提供线程安全的原子计数器,允许直接读写操作,而无需互斥体的开销。

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 中多个 Goroutine 的值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn