Go 中多线程并发操作的场景下,保证数据访问的安全至关重要。本文探讨了主线程需要从工作线程收集数据而不影响线程安全的场景。
场景
主线程创建多个工作线程,每个工作线程运行在它自己的 goroutine 并定期增加迭代计数。每 10 秒,主线程的目标是从工作线程收集迭代计数并显示综合统计数据。
问题
鉴于主线程仅读取而各个线程写入,直接访问值安全吗?如何有效地实现这一点?
答案
在 Go 中,直接从不同线程读取值而不进行同步本质上是不安全的,因为它可能会表现出未定义的行为。为了确保数据完整性,某种形式的同步是必要的。
实现注意事项
建议的解决方案利用sync.RWMutex 来保护共享数据。当工作线程写入迭代计数时,它们会获取写锁,而当主线程读取时,它会获取读锁。
使用sync.RWMutex的示例代码
或者,sync/atomic 包可用于管理线程安全的数据修改,如下所示代码:
使用sync/atomic的示例代码
以上是如何安全地从 Go 中的多个 Goroutine 读取值?的详细内容。更多信息请关注PHP中文网其他相关文章!