Golang Go语言中并发读写的问题请教

发布于 1周前 作者 sinazl 来自 Go语言

现在有个变量 a (type A struct{} 且 var a *A) ,想要动态修改 a 的字段 b (var b string) ,在同时多个 goroutine 读的情况下写入会不会不安全?把 b 的类型换成 func() 呢?
Golang Go语言中并发读写的问题请教

10 回复

看看你的场景是不是要求严格时序一致的了,如果是的话加读写锁。

更多关于Golang Go语言中并发读写的问题请教的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


放弃了,按照我的需求好像做不到。。。

可以使用 atomic

多个读一个写的话,写入不会有冲突

多个写会冲突,读哪有冲突一说。。。

顶多是读到你预期之外的数据(你以为写了但还没写完)

如果没写完 func 又有 goroutine 执行是不是有可能 panic 退出

两种方式:
1. 写时加写锁,读时加读锁
2. 把 a 放在 channel 中在 goroutine 间共享,谁拿到就可以操作

就是不想加锁以及 channel ,看看有没有什么原子操作可以做到,好像找不到

这种是不安全的

在Golang(Go语言)中处理并发读写时,核心在于利用Go的并发原语和通道(channels)来确保数据一致性和避免竞争条件。

  1. 使用Mutex(互斥锁): Go的sync包提供了Mutex类型,用于保护共享资源。在读写共享数据时,可以通过加锁和解锁来确保同一时间只有一个goroutine可以访问该数据。例如,使用mu.Lock()mu.Unlock()来包围读写操作。

  2. 使用RWMutex(读写互斥锁): 对于读多写少的场景,sync.RWMutex是更好的选择。它允许多个读操作并发进行,但写操作会阻塞所有其他操作(无论是读还是写)。使用RLock()RUnlock()进行读锁定,Lock()Unlock()进行写锁定。

  3. 使用通道(Channels): 通道是Go语言中实现并发的一种强大机制。通过通道,goroutine可以安全地传递数据,而无需显式锁定。对于生产者-消费者模式,通道是首选的并发工具。通过make(chan T)创建一个通道,使用<-操作符发送和接收数据。

  4. 避免数据竞争: 使用go run -race命令运行你的程序,可以检测数据竞争。这是Go语言内置的竞态检测工具,有助于发现潜在的并发问题。

总之,在处理Go语言中的并发读写时,应根据具体场景选择合适的并发原语,并始终注意数据一致性和线程安全。

回到顶部