gpt4 book ai didi

go - 在多个goroutine之间共享的Golang结构中,非共享成员是否需要互斥保护?

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

我有一个在多个 goroutine 之间共享的 Golang 结构。对于结构成员的并发访问,有互斥量 sync.RWMutex。对于单个goroutine访问的struct成员,是否需要互斥保护?

例如,在下面的代码中,一个单独的 writer goroutine 访问成员 shared.exclusiveCounter,没有任何锁保护。这是正确的/安全的吗?或者是否需要互斥锁,因为整个结构由多个 goroutines 通过共享指针访问?

package main

import (
"fmt"
"sync"
"time"
)

func main() {
s := &shared{mutex: &sync.RWMutex{}}

readerDone := make(chan int)
writerDone := make(chan int)

go reader(s, readerDone)
go writer(s, writerDone)

<-readerDone
<-writerDone
}

type shared struct {
mutex *sync.RWMutex
sharedCounter int // member shared between multiple goroutines, protected by mutex
exclusiveCounter int // member exclusive of one goroutine -- is mutex needed?
}

func (s *shared) readCounter() int {
defer s.mutex.RUnlock()
s.mutex.RLock()
return s.sharedCounter
}

func (s *shared) setCounter(i int) {
defer s.mutex.Unlock()
s.mutex.Lock()
s.sharedCounter = i
}

func reader(s *shared, done chan<- int) {
for {
time.Sleep(2 * time.Second)
counter := s.readCounter()
fmt.Printf("reader: read counter=%d\n", counter)
if counter > 5 {
break
}
}
fmt.Printf("reader: exiting\n")
done <- 1
}

func writer(s *shared, done chan<- int) {
s.exclusiveCounter = 0
for {
time.Sleep(1 * time.Second)
s.exclusiveCounter++
fmt.Printf("writer: writing counter=%d\n", s.exclusiveCounter)
s.setCounter(s.exclusiveCounter)
if s.exclusiveCounter > 5 {
break
}
}
fmt.Printf("writer: exiting\n")
done <- 1
}

Run it on playground

最佳答案

如果只有一个 goroutine 访问 struct 成员,则不需要互斥锁来控制访问。无论如何,我可能会使用一个(重新使用结构中现有的互斥锁,或者另一个互斥锁),因为虽然今天可能只有一个 goroutine 访问该结构成员,但没有任何强制措施。

关于go - 在多个goroutine之间共享的Golang结构中,非共享成员是否需要互斥保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35084268/

24 4 0