gpt4 book ai didi

go - 从并发 goroutines 设置和访问指针

转载 作者:IT王子 更新时间:2023-10-29 00:51:25 26 4
gpt4 key购买 nike

我有一个 map ,由 goroutine A 使用并在 goroutine B 中一次替换一次。替换我的意思是:

var a map[T]N

// uses the map
func goroutineA() {
for (...) {
tempA = a
..uses tempA in some way...
}
}

//refreshes the map
func gorountineB() {
for (...) {
time.Sleep(10 * time.Seconds)
otherTempA = make(map[T]N)
...initializes other tempA....
a = otherTempA
}
}

你看到这段伪代码有什么问题了吗? (在并发方面)

最佳答案

代码不安全,因为不能保证对指针值的赋值和读取是原子的。这可能意味着当一个 goroutine 写入新的指针值时,另一个 goroutine 可能会看到来自旧值和新值的混合字节,这将导致您的程序以一种令人讨厌的方式死掉。另一件可能发生的事情是,由于您的代码中没有同步,编译器可能会注意到 goroutineA 中的 a 没有任何变化,并将 tempA := a 语句从循环中移除。这意味着当其他 goroutine 更新它们时,您永远不会看到新的 map 分配。

您可以使用 go test -race 自动查找此类问题。

一种解决方案是使用互斥锁锁定对 map 的所有访问。

您不妨阅读 Go Memory Model文档,它清楚地解释了何时可以在 goroutine 中看到变量的更改。

关于go - 从并发 goroutines 设置和访问指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23926601/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com