如何在内部锁定对所有struct字段的并发访问?假设我有一个结构:
type Data struct {
ID string
Size int
//... and more fields
}将在另一个结构中使用:
type Project struct {
mu sync.Mutex
MetaData Data
//... and more fields
}我如何修改/获取MetaData结构并为此使用互斥锁,同时又不将其互斥暴露给外部包?我知道我可以使用Get/Set方法,但是如果我需要修改一个数据结构字段(如果每个字段都有一个具有相同共享互斥的get/set方法,那么就不是很好/干净了)。您能推荐一种方法/模式来拥有一个内部锁定/解锁的结构化互斥体吗?
发布于 2018-03-10 22:19:13
像这样的怎么样?
type Data struct {
ID string
Size int
//... and more fields
}
type Project struct {
mu sync.Mutex
metaData Data
//... and more fields
}
func (p *Project) AccessMetaData(f func(*Data)) {
p.mu.Lock()
defer p.mu.Unlock()
f(&p.metaData)
}发布于 2018-11-23 06:48:12
我对此很好奇,所以我对此进行了测试,如果父结构被锁定,子结构也会被锁定。在本地尝试,因为去操场似乎是决定性的。
package main
import (
"fmt"
"sync"
)
type testGroup struct {
sync.Mutex
items map[string]*test
}
type test struct {
x int
}
var str string = "test"
func increment(t *testGroup, wg *sync.WaitGroup) {
t.Lock()
t.items[str].x = t.items[str].x + 1
t.Unlock()
wg.Done()
}
func main() {
var w sync.WaitGroup
tg := testGroup{}
tg.items = make(map[string]*test)
tg.items[str] = &test{}
for i := 0; i < 1000; i++ {
w.Add(1)
go increment(&tg, &w)
}
w.Wait()
fmt.Println("final value of x", tg.items[str].x)
}尝试注释掉t.Lock()和t.Unlock()中的increment()函数
https://stackoverflow.com/questions/49214205
复制相似问题