gpt4 book ai didi

go - GOMAXPROCS=1 时的数据竞争

转载 作者:IT王子 更新时间:2023-10-29 01:15:45 24 4
gpt4 key购买 nike

我正在尝试理解 Golang 中的一个 typical data races从多个 goroutines 访问未 protected 全局变量可能会导致竞争条件:

var service map[string]net.Addr

func RegisterService(name string, addr net.Addr) {
service[name] = addr
}

func LookupService(name string) net.Addr {
return service[name]
}

它继续说我们可以通过用互斥体保护它来解决这个问题:

var (
service map[string]net.Addr
serviceMu sync.Mutex
)

func RegisterService(name string, addr net.Addr) {
serviceMu.Lock()
defer serviceMu.Unlock()
service[name] = addr
}

func LookupService(name string) net.Addr {
serviceMu.Lock()
defer serviceMu.Unlock()
return service[name]
}

到目前为止,还不错。令我困惑的是:

this question 的公认答案这表明一个 CPU 绑定(bind)的 goroutine 会饿死其他已经被多路复用到同一个操作系统线程上的 goroutine(除非我们明确地让步 runtime.Gosched())。这是有道理的。

对我来说,上面的 RegisterService()LookupService() 函数看起来受 CPU 限制,因为没有 IO 也没有 yield 。这是正确的吗?

如果是,并且如果 GOMAXPROCS 设置为 1,那么上例中的互斥体是否仍然是绝对必要的? goroutines 在可能出现竞争条件的地方受 CPU 限制这一事实不能解决这个问题吗?

即使是这样,我认为在现实生活中使用互斥量仍然是一个好主意,因为我们可能无法保证 GOMAXPROCS 的设置。还有其他原因吗?

最佳答案

正如 FUZxxl 和 Nick Craig-Wood 指出的,goroutines 的当前行为是特定于实现的。所以,也许,读取或写入 map 可以产生。考虑到 maps are not thread safe 、互斥或其他同步是正确的并发访问所必需的。

作为互斥体的替代方案,您可以生成一个 goroutine,它在您的 map 上执行所有操作并通过 channel 与其对话:

type writereq struct {
key string
value net.Addr
reply chan struct{}
}

type readreq struct {
key string
reply chan net.Addr
}

var service map[string]net.Addr
var reads = make(chan readreq)
var writes = make(chan writereq)

func RegisterService(name string, addr net.Addr) {
w := writereq{name, addr, make(chan struct{})}
writes <- w
return <-w.reply // return after registration confirmation
}

func LookupService(name string) net.Addr {
r := readreq{name, make(chan net.Addr)}
reads <- r
return <-r.reply
}

func serveRegistry() {
for {
select {
case r := <-reads:
r.reply <- service[r.name]
case w := <-writes:
service[w.name] = w.addr
w.reply <- struct{}
}
}
}

关于go - GOMAXPROCS=1 时的数据竞争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19066478/

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